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};