第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

提高字符串到二進(jìn)制數(shù)轉(zhuǎn)換的性能

提高字符串到二進(jìn)制數(shù)轉(zhuǎn)換的性能

慕妹3146593 2023-09-20 16:43:34
這是我在競爭性編程中遇到的問題之一。問題)您有一個二進(jìn)制格式的輸入字符串11100,您需要計算數(shù)字為零的步驟數(shù)。如果數(shù)字是odd -> subtract it by 1,如果even -> divide it by 2。例如28 -> 28/214 -> 14/27 -> 7-16 -> 6/23 -> 3-12 -> 2/21-> 1-10 -> 停止步數(shù)=7我想出了以下解決方案public int solution(String S) {    // write your code in Java SE 8    String parsableString = cleanString(S);    int integer = Integer.parseInt(S, 2);    return stepCounter(integer);}private static String cleanString(String S){    int i = 0;    while (i < S.length() && S.charAt(i) == '0')        i++;    StringBuffer sb = new StringBuffer(S);    sb.replace(0,i,"");    return sb.toString();}private static int stepCounter(int integer) {    int counter = 0;    while (integer > 0) {        if (integer == 0)            break;        else {            counter++;            if (integer % 2 == 0)                integer = integer / 2;            else                integer--;        }    }    return counter;}這個問題的解決方案看起來非常簡單明了,但是這段代碼的性能評估給了我一個大零。我最初的印象是,將字符串轉(zhuǎn)換為 int 是一個瓶頸,但未能找到更好的解決方案。有人可以向我指出這段代碼的瓶頸以及可以顯著改進(jìn)的地方嗎?
查看完整描述

3 回答

?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗 獲得超9個贊

如果二進(jìn)制數(shù)是奇數(shù),則最后一位(最低有效位)必須是1,因此減 1 就是將最后一位數(shù)字從 1 更改為 0(重要的是,這使數(shù)字成為偶數(shù))。

如果二進(jìn)制數(shù)是偶數(shù),則最后一位必須為0,除以零只需完全刪除最后一位 0 即可完成。(就像以 10 為基數(shù)一樣,數(shù)字 10 可以除以 10,去掉最后的 0,留下 1。)

所以步數(shù)是每 1 位數(shù)字兩步,每 0 位數(shù)字一步 - 減 1,因為當(dāng)你到達(dá)最后一個 0 時,你不再除以 2,你只是停止。

這是一個簡單的 JavaScript(而不是 Java)解決方案:

let n = '11100';
n.length + n.replace(/0/g, '').length - 1;

只需多做一點工作,如果需要的話,這也可以正確處理前導(dǎo)零“0011100”。


查看完整回答
反對 回復(fù) 2023-09-20
?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗 獲得超2個贊

需要減去的次數(shù)就是 1 位的個數(shù)Integer.bitCount()。您需要除法的次數(shù)是最高有效位的位置,即Integer.SIZE(32,整數(shù)中的總位數(shù))減去Integer.numberOfLeadingZeros()減一(您不需要除法1)。我假設(shè)對于零輸入,結(jié)果應(yīng)該為零。所以我們有

int?numberOfOperations?=?integer?==?0???0?:?Integer.bitCount(integer)?+?
??Integer.SIZE?-?Integer.numberOfLeadingZeros(integer)?-?1;


查看完整回答
反對 回復(fù) 2023-09-20
?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗 獲得超9個贊

根據(jù)給定的條件,如果數(shù)字是偶數(shù),我們將其除以 2,這相當(dāng)于刪除 LSB,同樣,如果數(shù)字是奇數(shù),我們將減去 1 并將其設(shè)為偶數(shù),這相當(dāng)于取消設(shè)置設(shè)置位(更改 1)至 0)。分析上述過程我們可以說,所需的總步驟數(shù)將是(位數(shù),即(log2(n)+1))和設(shè)置位數(shù) - 1(最后的0不需要刪除)之和。

C++代碼:

result = __builtin_popcount(n) + log2(n) + 1 - 1;

 result =  __builtin_popcount(n) + log2(n);


查看完整回答
反對 回復(fù) 2023-09-20
  • 3 回答
  • 0 關(guān)注
  • 149 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號