算法面试题四:两数之和,有效的数独,旋转图像
这里介绍两数之和,有效的数独及旋转图像的个人解决方法

题目一:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示:
2 <= nums.length <= 103 -109 <= nums[i] <= 109 -109 <= target <= 109 只会存在一个有效答案
答案:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let arr=[];
for(let i=0;i<nums.length-1;i++){
let bind = true;
let jj = 0;
for(let j=i+1;j<nums.length;j++){
if(nums[i]+nums[j] == target){
bind = false;
jj = j;
}
}
if(!bind){
arr.push(i)
arr.push(jj)
nums.splice(i,1);
nums.splice(jj,1);
i--;
}
}
return arr;
};
题目二:有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 1.数字 1-9 在每一行只能出现一次。 2.数字 1-9 在每一列只能出现一次。 3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: true
示例 2:
输入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: false
说明:
一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 给定数独序列只包含数字 1-9 和字符 '.' 。 给定数独永远是 9x9 形式的。
答案:
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
for (let arr of board) {
let row = []
for (let c of arr) {
if (c !== '.') row.push(c);
}
let set = new Set(row)
if (set.size !== row.length) return false;
}
// 检查每一列
for (let i = 0; i < 9; i++) {
let col = []
board.map( arr => {
if (arr[i] !== '.') col.push(arr[i])
})
let set = new Set(col)
if (set.size !== col.length) return false;
}
// 检查每个小方块
for (let x = 0; x < 9; x += 3) {
for (let y = 0; y < 9; y += 3) {
let box = []
for (let a = x; a < 3 + x; a ++) {
for (let b = y; b < 3 + y; b ++) {
if (board[a][b] !== '.') box.push(board[a][b])
}
}
let set = new Set(box)
if (set.size !== box.length) return false
}
}
return true
};
题目三:旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
示例 3:
输入:matrix = [[1]] 输出:[[1]]
示例 4:
输入:matrix = [[1,2],[3,4]] 输出:[[3,1],[4,2]]
提示:
matrix.length == n matrix[i].length == n 1 <= n <= 20 -1000 <= matrix[i][j] <= 1000
答案:
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
let length = matrix.length;
for(let i=0;i<length/2;i++){
for (let j = i; j < length - 1 - i; j++) {
let tmp = matrix[i][j];
matrix[i][j] = matrix[length - 1 - j][i];
matrix[length - 1 - j][i] = matrix[length - 1 - i][length - 1 - j];
matrix[length - 1 - i][length - 1 - j] = matrix[j][length - 1 - i];
matrix[j][length - 1 - i] = tmp;
}
}
return matrix;
};
如果对你有帮助,请你点个推荐,我会和你一起进步,加油(*^▽^*)。

浙公网安备 33010602011771号