最近接觸一道有趣的演算法題,意思是:給定一串數字,這串數字有可能大於long的最長長度,譬如12542670021,從這串數字中刪除k個數字,使得新數字串在所有可能性結果中最小,那麼應該刪除哪k個數字呢?
下面給出思路和**,以及**的優化。
當然,數字的大小高位影響最大,所以首先考慮的是最高為,即從最左邊開始。12
5426
7002
1如果這裡k=1,顯然刪除數字5,會得到最小值,即12
4267
0021
如果再繼續刪除乙個呢?將會是刪除數字4,即12
2670
021
從上面結果來看,邏輯思路是從左到右遍歷判斷左邊的是否大於右邊的,如果大於,則刪掉,否則,就儲存。
當刪除第三個數字時,就會判斷1<2,儲存;2=2,儲存;2<6,儲存;6<7,儲存;7>0,刪除7,即12
3600
21**如下:
public static string removekdigits(string num, int k)
} //如果沒有找到要刪除的數字
if(!hascut)
//清除最前面的0
numnew = removezero(numnew); }
//如果整數所有數字都被刪除,則直接返回0
if(numnew.length()==0)
return numnew;
}private static string removezero(string numnew)
stack[top] = c;
top++; }
int offset = 0;
while(offset < newlength && stack[offset]=='0')
return offset==newlength?"0":new string(stack, offset, newlength-offset);
}
刪除k個數字使剩下數字最小(大)
如 1593121212去掉3個數,剩下1121212最小。思路如下 刪除k個,可以採用貪心演算法,每次刪除1個 那麼每次刪哪乙個呢?此時我們已經能看出 要求剩下的數字最小,從左向右掃瞄,找出連續的非嚴格遞增串,刪除最後乙個 要求剩下的數字最大,從左向右掃瞄,找出連續的非嚴格遞減串,刪除最後乙個。核...
刪除K個數字,使剩下的數字串最大
題目 乙個n位的數,去掉其中的k位,問怎樣去掉使得留下來的那個 n k 位的數最大?分析 可以直接用貪心來求解,每次尋找從頭開始的連續遞減序列,刪除遞減序列的最後乙個元素,重複k次,最後剩下的數字串組成的數字最大。比如 13787323 第一次,遞減序列只有1,刪除1,得到3787323 第二次,遞...
算一串數字的entropy 數字
醫生,你確定我沒事嗎?要不要再做個檢查,核磁共振什麼的?金陵市第一腦科醫院內,李宇緊攥著醫生的雙手,滿臉緊張地問道。真沒什麼事兒,開點藥吃吃就行了。可能是最近壓力過大,回去注意休息,多喝喝開水,過一陣子就沒事了。中年醫生低著頭寫病歷,看也不看李宇,自顧自地說道。可是 李宇剛要再說些什麼,就被醫生塞過...