0-n之間的1的個數何時等於n(Java程序員面試寶典)

Consider a function which ,for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n.

for example, f(13)=6. notice that f(1)=1. what is the next largest n such that f(n)=n?

有一個整數n,寫一個函數f(n),返回0-n之間出現的"1"的個數。比如f(1)=1,f(13)=6(1、10、11、12、13一共6個1),問一個最大的f(n)=n中的n是多少?

這個題目的關鍵在於效率上,可以採用緩存的機制。可以吧前面的計算結果緩存下來,把每次的結果保存好,就不用每次都從新計算,從而可以提高效率。例如計算1-101,只要把之前1-100的結果與101的個數相加就行了。

代碼如下:

public class Example_1 {

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		int n = 2;
		int res = 1;
		while((getOne(n) + res) != n)
		{
			res += getOne(n);
			System.out.println("0到"+n+"之間的1的個數爲:"+res);
			++n;
		}
		long endTime = System.currentTimeMillis();
		System.out.println("計算所消耗時間爲:"+(endTime - startTime)/1000+"s");
		System.out.println(n);
	}

	private static int getOne(int n) {
		int num = 0;
		String s = n+"";
		int len = s.length();
		if(len != 0)
		{
			for(int i = 0;i < len; i++)
			{
				char c = s.charAt(i);
				if(c == '1')
				{
					num++;
				}
			}
		}
		return num;
	}

}

運行結果如下:

......................................................
0到199907之間的1的個數爲:199889
0到199908之間的1的個數爲:199890
0到199909之間的1的個數爲:199891
0到199910之間的1的個數爲:199893
0到199911之間的1的個數爲:199896
0到199912之間的1的個數爲:199898
0到199913之間的1的個數爲:199900
0到199914之間的1的個數爲:199902
0到199915之間的1的個數爲:199904
0到199916之間的1的個數爲:199906
0到199917之間的1的個數爲:199908
0到199918之間的1的個數爲:199910
0到199919之間的1的個數爲:199912
0到199920之間的1的個數爲:199913
0到199921之間的1的個數爲:199915
0到199922之間的1的個數爲:199916
0到199923之間的1的個數爲:199917
0到199924之間的1的個數爲:199918
0到199925之間的1的個數爲:199919
0到199926之間的1的個數爲:199920
0到199927之間的1的個數爲:199921
0到199928之間的1的個數爲:199922
0到199929之間的1的個數爲:199923
0到199930之間的1的個數爲:199924
0到199931之間的1的個數爲:199926
0到199932之間的1的個數爲:199927
0到199933之間的1的個數爲:199928
0到199934之間的1的個數爲:199929
0到199935之間的1的個數爲:199930
0到199936之間的1的個數爲:199931
0到199937之間的1的個數爲:199932
0到199938之間的1的個數爲:199933
0到199939之間的1的個數爲:199934
0到199940之間的1的個數爲:199935
0到199941之間的1的個數爲:199937
0到199942之間的1的個數爲:199938
0到199943之間的1的個數爲:199939
0到199944之間的1的個數爲:199940
0到199945之間的1的個數爲:199941
0到199946之間的1的個數爲:199942
0到199947之間的1的個數爲:199943
0到199948之間的1的個數爲:199944
0到199949之間的1的個數爲:199945
0到199950之間的1的個數爲:199946
0到199951之間的1的個數爲:199948
0到199952之間的1的個數爲:199949
0到199953之間的1的個數爲:199950
0到199954之間的1的個數爲:199951
0到199955之間的1的個數爲:199952
0到199956之間的1的個數爲:199953
0到199957之間的1的個數爲:199954
0到199958之間的1的個數爲:199955
0到199959之間的1的個數爲:199956
0到199960之間的1的個數爲:199957
0到199961之間的1的個數爲:199959
0到199962之間的1的個數爲:199960
0到199963之間的1的個數爲:199961
0到199964之間的1的個數爲:199962
0到199965之間的1的個數爲:199963
0到199966之間的1的個數爲:199964
0到199967之間的1的個數爲:199965
0到199968之間的1的個數爲:199966
0到199969之間的1的個數爲:199967
0到199970之間的1的個數爲:199968
0到199971之間的1的個數爲:199970
0到199972之間的1的個數爲:199971
0到199973之間的1的個數爲:199972
0到199974之間的1的個數爲:199973
0到199975之間的1的個數爲:199974
0到199976之間的1的個數爲:199975
0到199977之間的1的個數爲:199976
0到199978之間的1的個數爲:199977
0到199979之間的1的個數爲:199978
0到199980之間的1的個數爲:199979
計算所消耗時間爲:3s
199981

以上代碼是書中給出的解法,至於有沒有效率更高的解法,等我想到了再來補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章