如何對超限長度的數字進行運算呢?leetcode模擬加法運算超簡單

這是我參與更文挑戰的第16天,活動詳情查看: 更文挑戰java

1、題目描述

66. 加一

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

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

你能夠假設除了整數 0 以外,這個整數不會以零開頭。markdown

image-20210615162613360

2、思路分析

  • 首先本題考查就是咱們經常使用的加法。此題和2. 兩數相加考查點基本相同!只不過那題稍微難的是鏈表的加入。本題只是數組且純粹是加1操做!
  • 解題思路也很簡單!咱們只須要從數組末尾進行加1操做。後續判斷是否有進位就能夠了!

基礎知識

  • 在計算機彙總永遠都是二進制的天下。在介紹下面思路以前咱們須要瞭解java中基礎類型中的int、long等類型的取值範圍
  • 首先一個bit就是二進制中一位。一個字節包含8位。

image-20210615194256231

  • java中8中基本類型。byte、short、int、long、double、float、boolean、char

image-20210615194356672

轉成數字加1

image-20210615184836711

  • 將數組轉成數字而後進行加1,最後在轉換成數組。最後的數組可能會比以前多一位,這裏我用紅色進行特別標註了。在注入99這種類型的數字會發生增位的狀況!
public int[] plusOne(int[] digits) {
    int total = 0;
    for (int i = 0; i <digits.length ; i++) {
        total = total * 10 + digits[i];
    }
    total += 1;
    for (int i = digits.length - 1; i >= 0; i--) {
        digits[i]=total%10;
        total = total / 10;
    }
    if (total != 0) {
        digits = new int[digits.length + 1];
        digits[0] = 1;
    }
    return digits;
}
複製代碼
  • 按照上面的思路咱們能夠輕鬆實現,最終測試也是沒有問題的。咋看是沒有問題可是咱們仔細分析下仍是能夠看出其中的貓膩的或者說上面的代碼在必定程度是沒有問題的。
  • 題中指出在數組的長度最大是100 。 而咱們使用int類型接收的數字,int類型是4字節也就是32位數字最大值是2147483647 即2^31。那麼就會出現數組轉成數組超出範圍的狀況。那麼換成long能夠嗎?一樣的分析long類型64位也沒法知足100的長度。因此咱們這裏的思路在本題中是沒法經過檢驗的。
  • 只能說咱們是一種思路可是最終是沒法知足題目要求的。

入鄉隨俗

  • 平時咱們作加法須要藉助一個進位。在程序中也就是咱們須要一個額外的變量來存儲進位。

image-20210616133029990

  • 咱們仔細分析下兩個一位數相加最大值也就是18,也就是說進位只多是0或者1 。 而本題中恰巧就是添加1咱們能夠將理解成下一位的進位。
  • 咱們只須要從數組末尾開始循環這個操做,並且由於是加1因此只要產生了進位那麼當前值應該是0.也就是產生的結果是10

image-20210616133337100

  • 只會產生上面兩種狀況,其中c=a+b

image-20210616133714330

  • 第一步咱們開始從末尾也就是4開始進行加1操做!獲得的結果是5.由於5!=10。因此沒有產生進位,因此在4以前的數據都不會發生變化。因此咱們直接將5賦予數組末尾而後直接返回數組oop

  • 若是是9999,咱們在最後一位進行加1,結果是10這個時候產生進位咱們就須要到第三位進行加1,一樣會產生進位那麼咱們就須要一直重複下去。最終數組會被更新爲0000.post

  • 上面咱們分析了進位只多是1 , 因此在全部位都發生了進位後原數組就會變成0 , 咱們只須要在數組頭部添加一個1元素便可測試

image-20210616134119690

public int[] plusOne(int[] digits) {
    for (int i = digits.length - 1; i >= 0; i--) {
        digits[i]++;
        digits[i] = digits[i] % 10;
        //對10取餘以後若是是0說明發生進位,不然沒有進位直接結束
        if (digits[i] != 0) return digits;
    }
    //說明當前數組所有發生進位相似999數字!此時須要擴展數組而且第一位爲進位1
    digits = new int[digits.length + 1];
    digits[0] = 1;
    return digits;
}
複製代碼

4、總結

  • 本題結合數學加法只須要仔細觀察下加法產生的數據格式就能夠寫出來響應的代碼了。
  • 他的簡單是由於加的是1 , 若是不是1那麼咱們須要稍微變換下加數與進位的關係
  • 若是是乘法那麼進位不只僅是1 咱們也須要特殊考慮下!無論怎麼樣!此題算是咱們的一個開胃菜吧!!!

點讚唄!spa

相關文章
相關標籤/搜索