LeetCode --- 字符串、數(shù)組
簡書專欄:http://www.lxweimin.com/nb/41796568
知乎專欄:https://zhuanlan.zhihu.com/c_174823416
一、題目描述
來源:力扣(LeetCode)
給定一個由整數(shù)組成的非空數(shù)組所表示的非負(fù)整數(shù),在該數(shù)的基礎(chǔ)上加一。
最高位數(shù)字存放在數(shù)組的首位, 數(shù)組中每個元素只存儲單個數(shù)字。
你可以假設(shè)除了整數(shù) 0 之外,這個整數(shù)不會以零開頭。
示例 :
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數(shù)組表示數(shù)字 123。
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數(shù)組表示數(shù)字 4321。
二、實現(xiàn)思路以及代碼
2.1 思路一:暴力破解法(不通過)
可以將數(shù)組轉(zhuǎn)換為整數(shù),進行加一然后再轉(zhuǎn)換成為數(shù)組。但是這樣做有一個缺陷,就是如果數(shù)組中的數(shù)超過了整數(shù)的范圍,那么進行轉(zhuǎn)換時會報錯。有考慮過使用bigInteger但是那樣的話我覺得違背了題目想表達的含義。下面給出代碼:
public static int[] plusOne(int[] digits) {
int length = digits.length, temp = 0;
for(int i = length - 1; i >= 0; i--) {
temp += (digits[i] * Math.pow(10,length - i -1));
}
temp += 1;
String str = String.valueOf(temp);
String[] strs = str.split("");
int[] result = new int[strs.length];
for(int j = 0; j < str.length(); j++) {
result[j] = Integer.valueOf(strs[j]);
}
return result;
}
2.2 思路二:數(shù)組加一進位法(巧妙)
理解題意可以發(fā)現(xiàn),如果直接從數(shù)組入手,當(dāng)最后一位不為9時,可以直接在數(shù)組最后一位上+1,然后返回數(shù)組即可。所以要處理的就是當(dāng)最后一位為9時的情況。
模擬進位操作,從數(shù)組最后一位向前開始遍歷,若digits[i] + 1之后取余10等于0,則表明進位,繼續(xù)向前遍歷,進行加一操作,并判斷取余10之后是否為0,一直到不為0時表明該位置的數(shù)字加一之后不進位,返回該數(shù)組
特殊情況是當(dāng)出現(xiàn)9,99,999這類數(shù)字時,循環(huán)到底也不會返回,這是需要特殊處理一下,擴容一位,并令第一位為1即可
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >=0; i--) {
digits[i]++;
digits[i] %= 10;
if(digits[i] != 0) return digits;
}
digits = new int[digits.length+1];
digits[0] = 1;
return digits;
}
三、測試代碼
int[] nums1 = {6,5,4,3,2,1,0};
int[] nums2 = {6,5,4,3,2,9,9};
System.out.println(Arrays.toString(plusOne(nums1)));
System.out.println(Arrays.toString(plusOne(nums2)));
}
輸出結(jié)果為:
[6, 5, 4, 3, 2, 1, 1]
[6, 5, 4, 3, 3, 0, 0]