zoukankan      html  css  js  c++  java
  • 算法面试题四:两数之和,有效的数独,旋转图像

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

    题目一:两数之和

    给定一个整数数组 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;
    };

    如果对你有帮助,请你点个推荐,我会和你一起进步,加油(*^▽^*)。

  • 相关阅读:
    rabbitmq-高级(死信队列)
    rabbitmq-高级(TTL过期时间)
    springboot整合rabbitmq(topic主题模式)
    springboot整合rabbitmq(direct路由模式)
    glide图片加载库
    自己封装的OKhttp请求
    手机上搭建微型服务器
    listview实现点击条目上的箭头展开隐藏菜单。
    recycleview + checkbox 实现单选
    recycleview中使用checkbox导致的重复选中问题
  • 原文地址:https://www.cnblogs.com/smileZAZ/p/14365754.html
Copyright © 2011-2022 走看看