1.二进制求和
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
let L = a.length-1;
let R = b.length-1;
let sum=0,t=0;
let str = ''
while(L>=0||R>=0){
let s1 = a[L]?(a[L]-'0'):0
let s2 = b[R]?(b[R]-'0'):0
sum = s1+s2+t;
if(sum==0){
str+='0'
}else if(sum==1){
str+=sum%2
t=Math.floor(sum/2)
}else if(sum>=2){
t=Math.floor(sum/2)
str+=sum%2
}
L--
R--
}
if(t!=0){
str+='1'
}
return str.split('').reverse().join('')
};
2.x的平方根
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
if(x==0) return 0
if(x==1) return 1
if(x==2) return 1
if(x==3) return 1
if(x==5) return 2
for(let i=1;i<=Math.floor(x/2);i++){
if(i*i==x){
return i
}
if(i*i>x){
return i-1
}
}
};
3.Excel表列名称
/**
* @param {number} n
* @return {string}
*/
var convertToTitle = function(n) {
let obj = {0:'Z',1:'A',2:'B',3:'C',4:'D',5:'E',6:'F',7:'G',8:'H',9:'I',10:'J',11:'K',12:'L',13:'M',14:'N',
15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y'}
let arr = []
let t
while(n){
arr.unshift(obj[n%26])
if(n%26==0){
t=Math.floor(n/26)-1
}else{
t=Math.floor(n/26)
}
n=t
}
return arr.join("")
};
3.Excel表列序号
/**
* @param {string} s
* @return {number}
*/
var titleToNumber = function(s) {
let len = s.length
let sum = 0
for(let i=0;i<len;i++){
sum += Math.pow(26,len-(i+1))*(s[i].charCodeAt()-64)
}
return sum
};
4.阶乘后的零
/**
* @param {number} n
* @return {number}
*/
var trailingZeroes = function(n) {
let res = 0
while(n>=5){
n = Number.parseInt(n/5)
res+=n
}
return res
};
5.快乐数
思路:
- 最终会得到1.(返回true)
- 最终会进入循环(返回false)
- 找出过程中重复的数字避免进入无限循环,如果出现了重复的数字说明不是快乐数字,返回false,否则返回true。
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
const bitSquareSum = (x)=>{
let sum=0,cur
while (x>0) {
cur = x%10
sum+=cur*cur
x=Math.floor(x/10)
}
return sum
}
let s = new Set()
while(n!=1){
s.add(n)
n = bitSquareSum(n)
if(s.has(n)){
return false
}
}
return true
};
6.计算质数
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function(n) {
const isPrimes = (x)=>{
if(x<3){
return x>1
}
for(let i=2;i<=Math.sqrt(x);i++){
if(x%i==0) return false
}
return true
}
let res = 0
for(let i=1;i<n;i++){
if(isPrimes(i)){
res++
}
}
return res
};
7.2的幂
- 位运算
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
if(n<0) return false
let count = 0
while(n){
if((n & 0x1)==1) count++
if(count>=2) return false
n>>=1
}
if(count==0) return false
return true
};
8.各位相加
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
let sum=0
while(num){
sum += num%10
num = Math.floor(num/10)
if(num<=0){
if(sum<10){
return sum
}
num=sum
sum=0
}
}
return sum
};
9.丑数
/**
* @param {number} num
* @return {boolean}
*/
var isUgly = function(num) {
if(num<1) return false
while(num%2===0) num/=2
while(num%3===0) num/=3
while(num%5===0) num/=5
return num==1
};
10.丢失的数字
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
nums.sort((a,b)=>a-b)
for(let i=0;i<=nums.length;i++){
if(i!=nums[i]){
return i
}
}
};
11.3的幂
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfThree = function(n) {
let i=0,m
while((m=Math.pow(3,i++))<n){}
return m===n
};
12.有效的完全平方数
/**
* @param {number} num
* @return {boolean}
*/
var isPerfectSquare = function(num) {
let i=1
while(i*i<num){
i++
}
return i*i===num
};
12.排列硬币
/**
* @param {number} n
* @return {number}
*/
var arrangeCoins = function(n) {
let i=1,sum=0
while(sum<n){
sum+=i
i++
}
if(sum==n){
return i-1
}
if(sum>n){
return i-2
}
};
13.最小移动次数使数组元素相等
/**
* @param {number[]} nums
* @return {number}
*/
var minMoves = function (nums) {
let min = Math.min(...nums)
let res = 0
for(let i=0;i<nums.length;i++){
res+=nums[i]-min
}
return res
};
14.构造矩形
/**
* @param {number} area
* @return {number[]}
*/
var constructRectangle = function(area) {
let res = [area,1]
for(let i=Math.floor(Math.sqrt(area));i<=area;i++){
if(area%i==0){
let W = Math.floor(area/i)
if(((res[0]-res[1])>i-W)&&(i-W>=0)){
res=[i,W]
}
}
}
return res
};
15.完美数
/**
* @param {number} num
* @return {boolean}
*/
var checkPerfectNumber = function(num) {
if(num<=0) return false
let sum=0
for(let i=0;i*i<=num;i++){
if(num%i === 0){
sum+=i
if(i*i!=num){
sum+=num/i
}
}
}
return sum-num==num
};
16.范围求和 II
/**
* @param {number} m
* @param {number} n
* @param {number[][]} ops
* @return {number}
*/
var maxCount = function(m, n, ops) {
if(ops.length==0){
return m*n
}
ops.sort((a,b)=>a[0]-b[0])
let minX = ops[0][0]
ops.sort((a,b)=>a[1]-b[1])
let minY = ops[0][1]
return minX*minY
};
17.三个数的最大乘积
/**
* @param {number[]} nums
* @return {number}
*/
var maximumProduct = function(nums) {
let len = nums.length
if(len===3) return nums[0]*nums[1]*nums[2];
nums.sort((a,b)=>a-b);
let sum2= nums[len-1]*nums[len-2]*nums[len-3];
if(nums[1]>0){
return sum2
}
let sum1=nums[0]*nums[1]*nums[len-1]
if(sum1>=sum2){
return sum1
}else{
return sum2
}
};
18.错误的集合
/**
* @param {number[]} nums
* @return {number[]}
*/
var findErrorNums = function (nums) {
let len = nums.length
nums.sort((a, b) => a - b);
let res = [];
for (let i = 0; i < len - 1; i++) {
if (nums[i] == nums[i + 1]) {
res.push(nums[i]);
nums.splice(i, 1);
break;
}
}
for (let i = 0; i < len; i++) {
if (nums[i] !== i + 1) {
res.push(i + 1)
break;
}
}
if(res.length==1) res.push(1)
return res
};
19.自除数
/**
* @param {number} left
* @param {number} right
* @return {number[]}
*/
var selfDividingNumbers = function(left, right) {
let res = [],arr=[]
for(let i=left;i<=right;i++){
let str = i+""
res.push(i);
for(let j=0;j<str.length;j++){
if(i%parseInt(str[j])!==0){
res.splice(arr.indexOf(i),1)
break
}
}
}
return res
};
20.最大三角形面积
/**
* @param {number[][]} points
* @return {number}
*/
var largestTriangleArea = function(points) {
let number = -1;
for(let i of points)
for(let j of points)
for(let k of points)
number = Math.max(number,(i[0]*j[1] + j[0]*k[1] + k[0]*i[1] - (i[1]*j[0] + j[1]*k[0] + k[1]*i[0]))/2);
return number;
};