Skip to content

数学

x 的平方根

js
var mySqrt = function(x) {
  let left = 0;
  let right = x;
  while (left <= right) {
    let mid = left + (right - left) >> 1
    if (mid * mid <= x) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return right;
};

Pow(x, n)

js
var myPow = function(x, n) {
  if(n == 0 || n == 1) {
    return n == 0 ? 1 : x;
  } else if(n < 0) {
    return myPow(1 / x, Math.abs(n));
  } else {
    return n % 2 === 0 ? myPow(x * x, n / 2) : myPow(x * x, Math.floor(n / 2)) * x;
  }
}

整数反转

js
var reverse = function(x) {
  let ord = Math.abs(x);//去符号
  let now = 0;
  while(ord > 0){
    now = now * 10 + ord % 10;
    ord = Math.floor(ord / 10);
  }
  if(x < 0){
    return now <= Math.pow(2,31) ? -now : 0;
  }else{
    return now < Math.pow(2,31) ? now : 0;
  }
};

字符串相加

js
var addStrings = function(num1, num2) {
  const ans = []
  let i = num1.length -1, j = num2.length - 1, add = 0
  while(i >= 0 || j >= 0 || add != 0) {
    const x = i >= 0 ? parseInt(num1.charAt(i)) : 0;
    const y = j >= 0 ? parseInt(num2.charAt(j)) : 0;
    const result = x + y + add;
    ans.push(result % 10);
    add = Math.floor(result / 10)
    i--
    j--
  }
  return ans.reverse().join('')
}

字符串相乘

js
const multiply = (num1, num2) => {
  if(num1 == '0' || num2 == '0') return 0
  let len1 = num1.length; 
  let len2 = num2.length;
  let arr = new Array(len1 + len2).fill(0)
  let i = len1, j = len2
  while(i) {
    i--
    while(j) {
      j--
      let sum = num1[i]*num2[j] + arr[i+j+1]
      arr[i+j] += 0 | sum / 10
      arr[i+j+1] = sum % 10
    }
    j=len2;
  }
  while(arr[0] == 0) {
    arr.shift()
  }
  return arr.join('')
}

进制转换方程

js
// 10进制转n进制
function ten2x(num, n){
  var res = [];
  while(num > 0){
    res.push(num % n);
    x = Math.floor(num / n);
  }
  return res.reverse().join('');
}

七进制

js
var convertToBase7 = function(num) {
    if (num === 0) {
        return "0"
    }
    let negative = num < 0;
    num = Math.abs(num);
    const digits = []
    while(num > 0) {
        digits.push(num % 7);
        num = Math.floor(num / 7);
    }
    if(negative) {
        digits.push('-')
    }
    return digits.reverse().join('')
};

二进制求和

js
var addBinary = function(a, b) {
  let cur = '';
  let index1 = a.length - 1;
  let index2 = b.length - 1;
  let carry = 0;
  while(index1 >= 0 || index2 >= 0 || carry > 0) {
    const value1 = a[index1] ? Number(a[index1]) : 0;
    const value2 = b[index2] ? Number(b[index2]) : 0;

    const sum = value1 + value2 + carry;

    cur = sum % 2 + cur;
    carry = Math.floor(sum / 2);
    index1--
    index2--
  }
  return cur;
};

字符串相加

js
var addStrings = function(num1, num2) {
  const ans = []
  let i = num1.length -1, j = num2.length - 1, add = 0
  while(i >= 0 || j >= 0 || add != 0) {
    const x = i >= 0 ? (num1.charAt(j) - '0') : 0
    const y = j >= 0 ? (num2.charAt(j) - '0') : 0;
    const result = x + y + add;
    ans.push(result % 10);
    add = Math.floor(result / 10)
    i--
    j--
  }
  return ans.reverse().join('')
}

字符串相乘

js
var multiply = function(num1, num2) {
  if (num1 === '0' || num2 === '0') {
    return '0'
  }
  var l1 = num1.length, l2 = num2.length, p = new Array(l1 + l2).fill(0)
  for (var i = l1; i--;) {
    for (var j = l2; j--;) {
      var tmp = num1[i] * num2[j] + p[i + j + 1]
      p[i + j + 1] = tmp % 10
      p[i + j] += 0 | tmp / 10
    } 
  }
  while(p[0] === 0) {
    p.shift()
  }
  return p.join('')
};

只出现一次的数字(位运算)

js
var singleNumber = function(nums) {
  let ans = 0;
  for(let i = 0; i < nums.length; i++) {
    ans ^= nums[i];
  }
  return ans;
};

Released under the MIT License.