leetcode 运算小技巧

362 阅读2分钟

ASCII

常用

  • 0-9:48-57
  • A-Z:65-90
  • 小写:97-122

规则

  • 0 ~ 9 <A ~ Z < a ~ z
  • 数字比字母要小。如 “7”<“F”;
  • 数字0比数字9要小,并按0到9顺序递增。如 “3”<“8”
  • 同个字母的大写字母比小写字母要小32。如“A”<“a” 。
  • 字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” ;
  • “A”为65;“a”为97;“0”为 48

极限值

  • -Infinity === Number.NEGATIVE_INFINITY
  • Infinity === Number.POSITIVE_INFINITY

字典序

以字母顺序排列,与个数无关

a, b, c
ab, acb, ace
1, 11, 12, 2, 3, 4, 

随机数

Math.random();

返回介于 0(包含) ~ 1(不包含) 之间的一个随机数 eg:

Math.random(); 
0.7269116644302132
  • 在连续整数中取得一个随机整数 数值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) eg:产生1-10的随机数
let rand1 = Math.floor(Math.random() * 10 + 1);

编写产生startNumber至endNumber随机数的函数

function selectFrom(startNumber, endNumber) {
    var choice = endNumber - startNumber + 1;
    return Math.floor(Math.random() * choice + startNumber)
}
var rand2 = selectFrom(2,8);//产生2至8的随机数

进制转换

  • 使用parseInt('numberString',numberString的进制); 转成十进制
const p = '10';//这里的10是二进制的10
const value = parseInt(p,2); // value = 2;
  • 十进制转成对应的进制 num.toString(2); //2代表要转成2进制
const num = 3;
const value = num.toString(2); // value = '11';
  • BigInt('numString'); 兼容大数 注意如果numString是二进制,要在numString前面加个0b,代表当前的numString是个二进制的数,eg:
const p =  BigInt('0b' + '10101010101010101010').toString(10);//699050
const p =  BigInt('0b' + '11').toString(10); //p = 3

取整

  • 去掉小数部分
方法一: parseInt
const str = '6.7';
cosnt r = str.parseInt(str);// r = 6;

方法二:位移运算 >> 0
因为  x >> y 会先将x转成二进制,然后向右移动y位,也就是删掉后面y位,用新的二进制数再转成十进制; 而x >> 0就是会先将x转成二进制,抛弃掉小数部分,再又转成十进制。所以就能做到取整
const x = 6.7;
cosnt r = x >> 0;// r = 6;

方法三:位移运算 ~~(x)
~是按位取反运算,~~是取反两次。
~~的作用是去掉小数部分,因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数
const x = 6.7;
cosnt r = ~~(x);// r = 6;

方法四:Math.floor 注意正负区别
const x = 6.7;//x为正数
cosnt r = Math.floor(x);// r = 6;
const x = -6.7;//x为正数
cosnt r = Math.floor(x);// r = -7;


方法五: Math.trunc 只保留整数部分
const x = 6.7;
cosnt r = Math.trunc(x);// r = 6;
const x = -6.7;
cosnt r = Math.trunc(x);// r = -6;
  • 向上取整
Math.ceil(3/2); // 2
  • 四舍五入
Math.round(3/2) // 2

数组

  • 将map转成数组
const map =  new Set(nums);
const newArray = Array.from(map);
  • 删除数组中的某个元素 splice()
let nums = [1,2,2,4,5];
const index = nums2.indexOf(2);
if (index > -1) {
    const p = nums2.splice(index,1); 
    // p = [2]; 
    // nums2 = [1,2,4,5];
}
  • 排序 sort();
const arr = new Array("orange", "mango", "banana", "sugar"); 
const sorted = arr.sort(); 
console.log("Returned string is : " + sorted );  // banana,mango,orange,sugar

还可以自定义排序函数

//注意返回值是sort内部return的是number
[2, 5, 8, 1, 4].sort((a,b) => {
        return a > b ? 1:-1;
}); //[ 1, 2, 4, 5, 8] 

[2, 5, 8, 1, 4].sort((a,b) => {
        return a > b ? -1:1;
}); //[ 1, 2, 4, 5, 8] 
  • 多重数组初始化
// const matrix = Array(n).fill(0).map(() => Array(m).fill(0));//这种方式是错误的 因为如果 fill 的参数为引用类型,会导致都执行同一个引用类型
const matrix =  Array(2).fill(0).map(() => Array(2).fill(0));

//matrix : [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ]
  • 二维降一维
list = [[1,1,1],[2,2,2]];
list.flat();//二维降一维 => [1,1,1,2,2,2]

Map

  • 遍历
let nameSiteMapping = new Map(); 
nameSiteMapping.set("Google", 1); 
nameSiteMapping.set("Runoob", 2);
nameSiteMapping.set("Taobao", 3); 

// 迭代 Map 中的key 
for (let key of nameSiteMapping.keys()) { 
   console.log(key); 
} 

// 迭代 Map 中的 value 
for (let value of nameSiteMapping.values()) { 
    console.log(value); 
} 

// 迭代 Map 中的 key => value 
for (let entry of nameSiteMapping.entries()) {  
    console.log(entry[0], entry[1]); 
} 

// 使用对象解析 
for (let [key, value] of nameSiteMapping) {
    console.log(key, value); 
}
  • 快速初始化
const map = new Map([['a',1],['b',2]]);
  • 做函数参数
//声明
const dfs = (path:number[],indexMap:Map<number,number>) => {}
//调用
dfs([],new Map());
  • 回溯

    const typeDfs = (index:number, typeMap:Map<number,number>) => {
        if (index === 0) {
            return;
        }
        index--;
        for (let i = 0; i < 4; i++) {
            const item = i+1;
            if (typeMap.get(item) === 1) {
                typeMap.delete(item);
                //回溯
                typeDfs(index,typeMap);
            } else {
                typeMap.set(item,1);
                typeDfs(index,typeMap);
                //回溯
                typeMap.delete(item);
            }            
        }
    }
    typeDfs(presses,new Map());

位运算

  • 异或运算(XOR) ^
任意数字对0异或,都等于任意数字本身
0 ^ 0 = 0; 
0 ^ 1 = 1;

任意数字异或本身,都等于0;
1 ^ 1 = 0;
a ^ a = 0;

异或交换律
a ^ a ^ b = (a ^ a) ^ b = 0 ^ b = b

应用: 只出现一次的数字

指数表示

Math.pow(-2, 31) = -2^32; Math.pow(2, 31) = 2^32;

字符串

  • 删除空格
"a man".replace(/\s/g,""); //aman
  • 删除非0-9a-zA-Z 中的字符
"a man, a plan, a canal: panama".replace(/[^0-9a-zA-Z]/g,''); //amanaplanacanalpanama\

正则

  • 是否是字母
return /^[a-zA-Z]+$/.test(str);
  • 是否是数字
return /^[0-9]+$/.test(str);

leetCode多语言题解MarkDown写法

```typescript解法一 []
这里是typescript code

```rust解法一 []
这里是rust code