不会算法的前端不是好前端 用js刷leetcode,坚持每日一题 @TOC
4月
4.1日 String to Integer (atoi)
题目:8. String to Integer (atoi) 字符串转换整数
解法1: 用现成的parseInt()呀,来对比一下需求
| 题目要求为: | parseInt() |
|---|---|
| 无视开头空格 | 符合 |
| 含有符号 | 符合 |
| 无视整数部分后的字符 | 符合 |
| 范围在32位内,超出返回 INT_MAX (2^31− 1) 或 INT_MIN (−2^31) | 不符合(需要手动判断一下) |
| 不能有效转换时返回 0 | 不能转化时返回NaN |
/**
* @param {string} str
* @return {number}
*/
var myAtoi = function(str) {
const number = parseInt(str, 10);//10进制
if(isNaN(number)) return 0;//不能有效的转换
return number < Math.pow(-2, 31) ? Math.pow(-2, 31):(number > Math.pow(2, 31) - 1?Math.pow(2, 31) - 1:number);
}
再来看一下官方的方法:确定有限状态机
4.2日 Container With Most Water
题目:11. Container With Most Water 盛最多水的容器
var maxArea = function(height) {
var l = 0, r = height.length-1; // 左右指针
var temp = 0, ans = 0;
while(l < r){
temp = (r-l)*(Math.min(height[l],height[r])); //计算此时容积
ans<temp && (ans = temp); //记录最优解
height[l] < height[r] ? l++ : r--; //哪边短哪边往里移动
}
return ans;
};
4.3日 Container With Most Water
题目:22. Generate Parentheses 括号生成
一开始的写法比较蠢... 循环加(),set去重 () --> (()) --> (()()), ((())), (())() () --> ()() --> (())(), ()()(), ()(())
/**
* @param {number} n
* @return {string[]}
*/
var fun1 = function(s){
let ans = new Set();
for(let temp of s){
for(var j=0;j<temp.length;j++){
ans.add(temp.slice(0,j-1)+"()"+temp.slice(j-1));
}
}
return ans;
}
var generateParenthesis = function(n) {
if(n==0) return [];
let s = new Set();s.add("()");
while(--n){s = fun1(s);}
return [...s];
};
回溯
var generateParenthesis = function(n) {
let res = [];
let dfs = (s, left, right)=>{
if(left ==n &&right==n) return res.push(s);
if(left < n) dfs(s+'(', left+1, right);
if(right < left) dfs(s+')', left, right+1);
}
dfs('', 0, 0);
return res;
};
4.23 Rotate Matrix LCCI
01.07. Rotate Matrix LCCI 旋转矩阵
会占用额外空间的方法
var rotate = function(matrix) {
var _matrix = JSON.parse(JSON.stringify(matrix)), len = matrix.length;
for(var i=0;i<len;i++){
for(var j=0;j<len;j++){
matrix[j][len-1-i]=_matrix[i][j];
}
}
};
4.24 Coin LCCI
硬币,给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 动态规划,
/**
* @param {number} n
* @return {number}
*/
let waysToChange = (n)=> {
let dp = new Array(n+1).fill(1)
let coins = [1,5,10,25]
for(let i=1; i<4; i++){
for(let j=1; j<=n; j++){
if(j-coins[i]>=0){
dp[j] = (dp[j]+dp[j-coins[i]]) % (1e9+7)
}
}
}
return dp[n];
};
4.25 Permutations
46 Permutations 全排列 回溯法 深度优先搜索
var permute = function(nums) {
if(nums==0) return [];
var len=nums.length,used=[],path=[],ans=[];
var dfs = function(d){
if(d==len){ans.push([...path]);//拷贝}
for(var i=0;i<len;i++){
if(!used[nums[i]]){//该数字还没被加入path
path.push(nums[i]);
used[nums[i]] = true;
dfs(d+1);
path.pop();
used[nums[i]] = false;
}
}
}
dfs(0);
return ans;
};