琪琪喜歡旅遊。有一天,她發現了一盞神燈,不幸的是,燈裡的精靈不是那麼善良。琪琪必須回答乙個問題,然後精靈會實現她的乙個夢想。問題是:給你乙個整數,你需要刪除 m 位數。剩下的的數字將形成乙個新的整數,你要讓這個整數最小。
不允許改變量字的順序。現在你能幫助琪琪實現她的夢想嗎?
給定兩個正整數 x 和 m,要求從 x 中刪除任意 m 位(不改變量字順序),使得產生的正整數 r 最小。
列出 x(位數為 n) 刪除 m 位後的所有可能結果,從中找出最小值。
暫時假設 x 的前 n - m 位為最小值,記為 min
列舉所有刪除 x 的任意一位的結果,m 減小 1
對剩下的整數使用遞迴,重複 1 中操作
當 m 變為 0 時,判斷當前整數是否小於 min,若是,則把 min 替換為當前整數。注意:由於整數第一位不能為 0,所以當前整數第一位為 0 時不進行替換。
package lab.lab1.problem3;
public
class
magiclamp1
/*** 從字串中刪除m位字元
**@param str 字串
*@param m 要刪除的字元位數
*/private
void
delete(string str, int m)
return;
}for (int i = 0; i < str.length(); i++)
}}
要找到最小整數 r,首先 r 的第一位要最小。由於不能改變量字順序,r 的第一位在 x 裡不能過於靠後。否則第一位確定後,後面的數字會不夠,r 的位數會小於 n - m 位,即刪除的數字超過 m 位。所以應在 x 的前 m + 1 位中找到最小值作為 r 的第一位,這樣即使選擇的是第 m + 1 位,捨棄掉的也是 x 的前 m 位,剛好符合題意。
舉個例子,x = 4973158,m = 3,r 應該有 7 - 3 = 4 位。如果 r 的第一位取 x 所有位中的最小值 1,而 x 在 1 後面(包括 1)的數字是 158,只有 3 位,r 的位數明顯不夠。而在 x 的前 4 位中取最小值 3,x 在 3 後面(包括 3)的數字是 3158,恰好有 4 位,所以 r 為 3158。
package lab.lab1.problem3;
public
class
magiclamp2
private
void
findmin(string str, int m)
return;
}if (result.length() == length)
int minposition;
if (this.m == m) else
result += parsestr(str, minposition);
findmin(str.substring(minposition + 1), m - minposition);//已經去掉了minposition位
}/**
* 獲取數字最小的一位
**@param str 整數字串
*@return 數字最小的一位的位置
*/private
intgetmin(string str)
}return position;
}/**
* 獲取數字最小的一位(0除外)
**@param str 整數字串
*@return 數字最小的一位的位置
*/private
intgetminexceptzero(string str)
}return position;
}/**
* 獲取整數的某位數字
**@param str 字串
*@param index 第幾位
*@return 該位數字
*/private
intparsestr(string str, int index)
由於執行時間取決於 n 和 m 兩個未知數,方案 2 中還與最小位的位置有關,時間複雜度較難計算,於是我們用直觀的方式比較兩種方案的執行時間。
測試類
package lab.lab1.problem3;
public
class
test
}
輸出
m=3
方案1:14397292646574,22220000ns
方案2:14397292646574,48000ns
m=8方案1:122646574,75061188000ns
方案2:122646574,10000ns
m=2方案1:164397292646574,494000ns
方案2:164397292646574,34000ns
可以發現,方案 2 明顯比方案 1 執行速度快很多。m = 8 時,方案 1 需要一分多鐘,而方案 2 只需要 10 ms。
上面控制了變數 n,同樣的方式控制變數 m ,可以得到結論: n 和 m 越大,方案 2 的優勢越明顯。
雖然方案 2 的**比方案 1 複雜許多,但其效率比方案 1 高非常多,值得使用。
最小正整數
有乙個整數,除5餘3 除3餘2 除2餘1,求滿足條件的最小正整數。那麼while 1 其中1代表乙個常量表示式,他永遠不會等於0。所以,迴圈會一直執行下去。除非你設定break等類似的跳出迴圈語句迴圈 才會中止 include 最小正整數 續 加速 include using namespace s...
python 尋找最小正整數N,滿足某個條件
找出具有下列各性質的最小正整數 n 它的最後一位數字是6,如果把最後的6去掉並放在最前面所得到的數是原來數的4倍。coding utf8 第一種是網上的一種暴力解法 每次加10,然後判斷是否符合條件 print this is console module from itertools import...
c獲取最大正整數,最小負整數
最大正整數,即最高位 符號位 為0,其餘位皆為1.1所有位皆為1 1右移一位即為最大正整數 但是直接右移是算術右移 所謂算術右移,是指左邊補符號位 所以要先強制轉化成無符號,再右移,就是邏輯右移了 所謂邏輯右移,是指左邊補0 int max unsigned 1 1 最小負整數,最高位為1,其餘皆為...