每天一道算法題(十八)

加一

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

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

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

示例 1:

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

示例 2:

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

這道題很簡單,只需要考慮到9這個情況就可以了。

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
  var last = digits.length - 1;
  if(digits[last] !== 9){
    digits[last]++;
    return digits
  }
  while(digits[last]&&digits[last] === 9){
    digits[last] = 0;
    last--;
  }
  if(last === -1){
    digits.unshift(1)
    return digits;
  }else{
    digits[last]++;
    return digits;
  }
};

執行用時 :72 ms
內存消耗 :32.4 MB

字符串相乘

給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示爲字符串形式。

示例 1:

輸入: num1 = “2”, num2 = “3”
輸出: “6”
示例 2:

輸入: num1 = “123”, num2 = “456”
輸出: “56088”
說明:

  • num1 和 num2 的長度小於110。
  • num1 和 num2 只包含數字 0-9。
  • num1 和 num2 均不以零開頭,除非是數字 0 本身。
  • 不能使用任何標準庫的大數類型(比如 BigInteger)或直接將輸入轉換爲整數來處理。

不能直接使用大數類型直接轉換,採用拆分兩個數之後將拆解的數分別進行相乘後相加。
比如11 * 12 這種,
在這裏插入圖片描述
可以看作是10 * 10+10 * 2 + 1 * 10 + 1 * 2這樣,這時候只需要考慮每個乘積滿
10的情況。

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var multiply = function(num1, num2) {
  if(num1 === '0' || num2 === '0') return '0'
  let length1 = num1.length,
  length2 = num2.length,
  result = new Array(length1+length2).fill(0)
  for(let i = length1-1;i>=0;i--){
    for(let j = length2-1;j>=0;j--){
      const num = num1[i] * num2[j]
      const p1 = i + j;
      const p2 = i + j + 1;
      const sum = num + result[p2]
      result[p1] += Math.floor(sum/10)
      result[p2] = sum%10
    }
  }
  if(result[0] === 0 ) result.shift()
  return res.join('')
};

執行用時 :72 ms
內存消耗 :36.6 MB

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