演算法初步(一)尋找最小正整數

2021-08-22 15:09:25 字數 2604 閱讀 4053

琪琪喜歡旅遊。有一天,她發現了一盞神燈,不幸的是,燈裡的精靈不是那麼善良。琪琪必須回答乙個問題,然後精靈會實現她的乙個夢想。問題是:給你乙個整數,你需要刪除 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,其餘皆為...