力扣第66、67題

力扣第66題、加一

給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。

最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。

示例 2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。

解題思路

1. 這道題需要整理出來有哪幾種情況,在進行處理會更舒服

2. 末位無進位,則末位加一即可,因爲末位無進位,前面也不可能產生進位,比如 45 => 46

3. 末位有進位,在中間位置進位停止,則需要找到進位的典型標誌,即爲當前位 %10後爲 0,則前一位加 1,直到不爲 0 爲止,比如 499 => 500

4. 末位有進位,並且一直進位到最前方導致結果多出一位,對於這種情況,需要在第 2 種情況遍歷結束的基礎上,進行單獨處理,比如 999 => 1000

代碼:

class Solution {
  public int[] plusOne(int[] digits) {
    int len=digits.length;
    for(int i=len-1;i>=0;i--){
      digits[i]++;
      digits[i]%=10;
      if(digits[i]!=0){
        return digits;
      }
    }
    digits=new int[len+1];
    digits[0]=1;
    return digits;
  }
}

力扣第67題、二進制求和

給你兩個二進制字符串,返回它們的和(用二進制表示)。

輸入爲 非空 字符串且只包含數字 1 和 0。

示例 1:

輸入: a = “11”, b = “1”
輸出: “100”

示例 2:

輸入: a = “1010”, b = “1011”
輸出: “10101”

提示:

  • 每個字符串僅由字符 ‘0’ 或 ‘1’ 組成。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 “0” ,就都不含前導零。

解題思路:

這裏可以先獲取到兩個字符串的末尾,然後通過指針的移動進行相加,a[i]+a[j]取餘2之後的結果,爲1就保留,爲0的話,說明可能兩者都是0,或者兩者都是1,產生了進位,我們可以記錄下這個進位,等到兩個指針再次向前移動後,加上進位的結果,繼續判斷是否需要繼續進位,循環結束後,判斷記錄進位值是否大於0,大於的話,我們可以直接在前面再加上一個“1”,或者進行(t%2).

代碼:

class Solution {
public:
    string addBinary(string a, string b) {
        int i=a.length()-1;
        int j=b.length()-1;
        string ret="";
        int t=0;
        while(i>=0||j>=0){            
            if (i>=0&&a[i]=='1') t++;
            if (j>=0&&b[j]=='1') t++;
             ret+='0'+(t%2);
             t=t/2;
             j--;
             i--;
        }
        if (t>0) ret+='0'+(t%2);
        reverse(ret.begin(),ret.end());
        return ret;
    }
};

關注公衆號,奈斯雜文,菜鳥小謝帶你學你java,帶你刷算法。
1

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