剑指 Offer 67. 把字符串转换成整数
// 注意边界值和判定条件,数字不能用parseInt(),这里的i-'0'需要括号,要不然就会变成字符串拼接改变了数据类型。
var strToInt = function(str) {
let flagSpace = true;//头部空格
let flag = 0;//正负号,未出现为0,正号为1,负号为2
let first = 0;//第一个非空字符,未出现为0,符号为1,数字为2
let res = 0;
for(let i of str){
if(i==' '&&flagSpace) continue;
else{
flagSpace = false;
if(!first){
// 第一个字符不为符号或数字
if(i!='+'&&i!='-'&&(i<'0'||i>'9')){
return 0;
}
// 第一个字符为符号
if(i=='+'||i=='-'){
flag = i=='+'?1:2;
first = 1;
}
// 第一个字符为数字
else{
first = 2;
res += i - '0';
}
continue;
}
if(i<'0'||i>'9'){
break;
}
else {
res = res*10 + (i - '0');
if(flag!=2&&res>2147483647) return 2147483647;
if(flag==2&&res>2147483648) return -2147483648;
}
}
}
return flag!=2?res:-res;
};
剑指 Offer 59 - I. 滑动窗口的最大值
// 被困难吓到了,没想到暴力就出来了。
var maxSlidingWindow = function(nums, k) {
if(!nums.length) return [];
if(k==1) return nums;
let store = [];
let getMax = (arr)=>{
let max = Number.MIN_VALUE;
for(let i of arr){
max = i>max?i:max;
}
return max;
}
let res = [];
for(let i of nums){
if(store.length<k){
store.push(i);
}
else{
res.push(getMax(store));
store.shift();
store.push(i);
}
}
res.push(getMax(store));
return res;
};
// 单调队列
var maxSlidingWindow = function(nums, k) {
if(!k||!nums.length) return [];
if(k==1) return nums;
let store = [];
let res = [];
for(let i =0;i<k;i++){
if(!store.length) {
store.push(nums[i]);
continue;
}
while(store.length&&store[store.length-1]<nums[i]) store.pop();
store.push(nums[i]);
}
for(let i = k-1;i<nums.length;i++){
while(store.length&&store[store.length-1]<nums[i]) store.pop();
store.push(nums[i]);
if(i-k>=0){
if(nums[i-k]==store[0]) store.shift();
}
res.push(store[0]);
}
return res;
};
关于单调队列,在形成原始队列时,若新加的值大于队尾值,已知FIFO,队尾值会优先弹出,所以可以直接弹出小于新加值的所有值。而在滑动窗口移动时,需要注意左侧弹出的值是不是当前队列的最大值,若是则通过原始方法无法更新队首的最大值,此时就需要手动弹出队首的值。