Leetcode 283 移动零
//双指针
var moveZeroes = function(nums) {
let left = 0;
let right = left+1;
let len = nums.length;
if(len<=1) return nums;
while(right<len){
if(nums[left]!=0){
left++;
right++;
}
else if(nums[right]!=0){
let store = nums[left];
nums[left] = nums[right];
nums[right] = store;
}
else{
right++;
}
}
return nums;
};
LeetCode 1 两数之和
//暴力求解,双for循环
var twoSum = function(nums, target) {
for(i = 0; i<nums.length-1;i++){
for(j = i+1; j<nums.length;j++){
res = nums[i]+nums[j]
if(res == target){
return [i,j];
}
continue
}
}
return [];
};
//借助map,需要注意的是不是全部加入map后再判断,而是在加之前判断,这样节省更多时间而且可以避免重复的元素。
var twoSum = function(nums, target) {
let map = new Map();
for(let i in nums){
if(map.has(target-nums[i])){
return [map.get(target-nums[i]),i];
}
else{
map.set(nums[i], i)
}
}
};
LeetCode 36 有效的数独
//根据map的唯一性来确定有没有重复值,用索引来对应数字,如果大于一就是出现了两次。(因为没有大于0的数字,也不用担心数组溢出。
var isValidSudoku = function(board) {
let rows = new Array(9).fill(0).map(()=>new Array(9).fill(0));
let cols = new Array(9).fill(0).map(()=>new Array(9).fill(0));
let box = new Array(3).fill(0).map(()=>new Array(3).fill(0).map(()=>new Array(9).fill(0)));
for(let i in board){
for(let j in board[0]){
if(board[i][j]!=="."){
let index = board[i][j].charCodeAt() - 48 -1;//注意减一,索引从0开始。
rows[i][index]++;
cols[j][index]++;
box[Math.floor(i/3)][Math.floor(j/3)][index]++;
if(rows[i][index]>1||cols[j][index]>1||box[Math.floor(i/3)][Math.floor(j/3)][index]>1){
return false;
}
}
}
}
return true;
};
LeetCode 48 旋转图像
//不借助数组了,原地解决。
//方法一,原地旋转。存在一个重复翻转的问题。找规律就可知一个位置旋转四次之后就回到原处。需要注意n为奇数时,划分的区域为一个(n-1)/2×(n+1)/2的矩形。注意Math.floor()方法,这里是n/2不是(n-1)/2。
var rotate = function(matrix) {
let n = matrix.length;
for(let i = 0 ;i<Math.floor((n)/2);i++){
for(let j = 0 ;j<Math.floor((n+1)/2);j++){
let temp = matrix[i][j];
matrix[i][j] = matrix[n-j-1][i];
matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
matrix[n-i-1][n-j-1] = matrix[j][n-i-1];
matrix[j][n-i-1] = temp;
}
}
};
//方法二,先水平翻转,再对角线翻转。
var rotate = function(matrix) {
let len = matrix.length;
for(let i = 0 ;i<Math.floor(len/2);i++){
for(let j in matrix){
swap(matrix,i,j,len-1-i,j);
}
}
for(let i = 0; i<len-1;i++){
for(let j = i+1;j<len;j++)
swap(matrix, i, j, j, i);
}
};
var swap = (matrix, x1, y1, x2, y2) =>{
let tmp = matrix[x1][y1];
matrix[x1][y1] = matrix[x2][y2];
matrix[x2][y2] = tmp;
}
LeetCode 344 翻转字符串
//索引对称。
var reverseString = function(s) {
let len = s.length;
for(let i = 0;i<Math.floor((len+1)/2);i++){
swap(s, i, len-1-i);
}
};
var swap = (nums, x, y) =>{
let temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
//双指针。牺牲空间换时间了。
var reverseString = function(s) {
let len = s.length;
for(let i = 0, j = len-1;i<j;i++,j--){
[s[i],s[j]] = [s[j],s[i]];
}
};