关于前端:力扣网简单题加一二进制求和x-的平方根

1. 加一

给定一个由 整数 组成的 非空 数组所示意的非负整数,在该数的根底上加一。

最高位数字寄存在数组的首位, 数组中每个元素只存储单个数字。

你能够假如除了整数 0 之外,这个整数不会以零结尾。

示例 1:

输出:digits = [1,2,3]
输入:[1,2,4]
解释:输出数组示意数字 123。

示例 2:

输出:digits = [4,3,2,1]
输入:[4,3,2,2]
解释:输出数组示意数字 4321。

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    // 我的想法是在解决数组之前就判断数组是不是全副是9,如果全副是9,在加完1后,须要在首位拼一个1作为进位。
    let flag = true;
    digits.forEach(v => {
        if(flag){
            if(v !== 9){
                flag = false; 
            }
        }
    })
    // 从后往前遍历
    for(i = digits.length - 1; i => 0;i--){
        if(digits[i] === 9){
            digits[i] = 0
        }else{
            // 当不为9时,加一后就完结循环。
            digits[i]++;
            break;
        }
    }
    //如果全副是9如,[9],[9,9]解决后会变成[0],[0,0]。须要拼接一个[1]
    if(flag){
        return [1].concat(digits)
    }
    return digits;
};

2.二进制求和

给你两个二进制字符串,返回它们的和(用二进制示意)。

输出为 非空 字符串且只蕴含数字 1 和 0。

示例 1:

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

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    let arrA = a.split('')
    let arrB = b.split('')
    let len = arrA.length < arrB.length ? arrB.length : arrA.length
    let c = 0
    let result = ''

    for(let i = len - 1; i >= 0 || c > 0; i--) {
        
        let curA = arrA.pop()
        let curB = arrB.pop()

        if(curA) {
            c += parseInt(curA)
        }
        if(curB) {
            c += parseInt(curB)
        }
        result = (c % 2) + result
        c = c > 1 ? 1 : 0
    }
    return result
};

3. x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

因为返回类型是整数,后果只保留 整数局部 ,小数局部将被 舍去 。

留神:不容许应用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

例 1:

输出:x = 4
输入:2

示例 2:

输出:x = 8
输入:2
解释:8 的算术平方根是 2.82842…, 因为返回类型是整数,小数局部将被舍去。

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
  // 第一种办法,从0开始循环,当平方大于x,那就是此时循环的值减去1.
  // let res = 0;
  // if(x < 2){
  //     return x
  // }
  // if(x === 2){
  //     return 1
  // }
  // for(let i = 0;i<x;i++){
  //     if(i*i>x){
  //         res = i;
  //         break
  //     }
  // }
  // return res - 1;
  // 第二种办法,二分法,每次循环从新计算两头地位,一直放大范畴
  let left = 0;
  let right = x;
  let mid;
  while(left <= right){
    mid = Math.ceil((left+right)/2);
    if(mid*mid === x){
      return mid;
    }else if(mid*mid < x){
      left = mid + 1;
    }else{
      right = mid -1;
    }
  }
  return right
};

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理