leetcode之模拟刷题总结3

leetcode之模拟刷题总结3

1-转置矩阵
题目链接:题目链接戳这里!!!

思路:对应行的值放到对应列即可,easy题一道,先做一道easy题,自我安慰安慰。

class Solution {
    public int[][] transpose(int[][] matrix) {
        int m = matrix.length ;
        int n = matrix[0].length ;
        int [][] ans = new int [n][m] ;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                ans[j][i] = matrix[i][j] ;
            }
        }
        return ans ;
    }
}

在这里插入图片描述
2-输出比赛匹配对
题目链接:题目链接戳这里!!!

思路:team[i-1]表示每个队伍的初始情况,一共需要经过第一层循环次数的配对,每轮配对,依次将第一个和最后一个配对,第二个和倒数第二个配对,依次类推。

class Solution {
    public String findContestMatch(int n) {
        String [] team = new String[n] ;
        for(int i=1; i<=n; i++){
            team[i-1] = i + "" ;
        }
        for(;n>1;n/=2){
            for(int i=0; i<n/2; i++){
                team[i] = "(" + team[i] + "," + team[n-i-1] + ")" ;
            }
        }
        return team[0] ;
    }
}

在这里插入图片描述
3-翻转图像
题目链接:题目链接戳这里!!!

思路:image[i][j] != image[i][-1-j],如:0, 1,先交换变成1, 0,再取非又变回0, 1,故什么都不做。
image[i][j] == image[i][n-1-j],同时取非。

class Solution {
    public int[][] flipAndInvertImage(int[][] image) {
        int m = image.length;
        int n = image[0].length ;
   
        for(int i=0; i<m; i++){
            for(int j=0; j<(n%2==0 ? n/2 : n/2+1); j++){
                if(image[i][j]==image[i][n-j-1]){
                    if(j!=n-j-1){
                        image[i][j] = 1 - image[i][j] ;
                        image[i][n-j-1] = 1 - image[i][n-j-1] ;
                    }else{
                        image[i][j] = 1 - image[i][j] ;
                    }
                }
            }
        }
        return image ;
    }
}

在这里插入图片描述
4-困于环中的机器人
题目链接:题目链接戳这里!!!

思路:(x,y)模拟当前坐标,face模拟当前面朝方向,一轮指令下来,只有不在原点并且面朝方向未改变的才最终回不到原点。

class Solution {
    public boolean isRobotBounded(String instructions) {
        int x = 0, y = 0 ; 
        int face = 0 ;
        int [] dx = {-1,0,1,0} ;
        int [] dy = {0,1,0,-1} ;
        char [] c = instructions.toCharArray() ;
        for(char ch : c){
            switch(ch){
                case 'R' : face = (face+1)%4 ; break ;
                case 'L' : face = (face+3)%4 ; break ;
                case 'G' : x += dx[face] ; y += dy[face]; break ;    
            }
        }
        return (x==0 && y==0) || (face % 4 != 0) ;
    }
}

在这里插入图片描述
5-分糖果II
题目链接:题目链接戳这里!!!

思路:模拟分糖果的过程就可以,只要有糖果就可以继续分,每次糖果数大于等于应分的数量n,就分n,否则,分掉剩余全部糖果。

class Solution {
    public int[] distributeCandies(int candies, int num_people) {
        int [] ans = new int [num_people] ;
        int n = 1 ;
        int i = 0 ;
        while(candies>0){
            if(candies-n>=0){
            ans[i] += n ;
            candies -= n ; 
            n++ ;
            i = (i+1)%num_people ;
        }else{
            ans[i] += candies ;
            break ;
        }
        }
        return ans ;
    }
}

在这里插入图片描述
6-查询带键的排列
题目链接:题目链接戳这里!!!

思路:使用List集合模拟数组p的元素变动情况,每次将相应的元素从List集合删除并插入List集合头部。

class Solution {

    public int[] processQueries(int[] queries, int m) {
        List<Integer> p = new ArrayList<>() ;
        for(int i=0; i<m; i++){
            p.add(i+1) ;
        }
        int [] ans = new int [queries.length] ;
        for(int i=0; i<queries.length; i++){
            int x = f(queries[i],p) ;
            ans[i] = x ;
            p.remove(x) ;
            p.add(0,queries[i]) ;
        } 
        return ans ;
    }
    public int f(int value, List<Integer> p){
        for(int i=0; i<p.size(); i++){
            if(value==p.get(i)){
                return i ;
            }
        }
        return 0  ;
    }
}

在这里插入图片描述
7-奇数值单元格的数目
题目链接:题目链接戳这里!!!

思路:使用两个数组row和column分别标记行和列是否是奇数。

class Solution {
    public int oddCells(int m, int n, int[][] indices) {
        boolean [] row = new boolean[m] ;
        boolean [] column = new boolean[n] ;
        int r = 0, c = 0 ;
        for(int i=0; i<indices.length; i++){
            row[indices[i][0]] = !row[indices[i][0]] ;
            column[indices[i][1]] = !column[indices[i][1]] ;
        }
        for(int i=0; i<m; i++){
          if(row[i]){
              r ++ ;
          }
        }
        for(int i=0; i<n; i++){
            if(column[i]){
                c ++ ;
            }
        }
        return r*n + c*m - 2*r*c ;

    }
}

在这里插入图片描述
8-用栈操作构建数组
题目链接:题目链接戳这里!!!

思路:模拟整个过程就可以,从1到n,每次值等于target时候,将Push加入list集合,每次值小于target则需要进行target-i的Push和Pop。

class Solution {
    public List<String> buildArray(int[] target, int n) {
       List<String> ans = new ArrayList<>() ;
       int j = 0 ;
       for(int i=1; i<=n; i++){
           if(j > target.length-1 || target[j]<i){
               break ;
           }
           if(target[j]==i){
               ans.add("Push") ;
               j ++ ;
           }else if(target[j]>i){
               for(int k=0; k<target[j]-i; k++){
                   ans.add("Push") ;
                   ans.add("Pop") ;
               }
               i += (target[j]-i-1) ;
           }
           
       } 
       return ans ;
    }
}

在这里插入图片描述
9-换酒问题
题目链接:题目链接戳这里!!!

思路:模拟换酒过程就可以,只要当前的酒瓶数大于兑换数,则循环,每轮循环求出喝掉的酒数res。同时更新酒瓶数numBottles。

class Solution {
    public int numWaterBottles(int numBottles, int numExchange) {
        int res = 0 ;
        int temp = numBottles ;
        while(numBottles>=numExchange){
            int n = numBottles / numExchange ;
            res += (numBottles / numExchange) ;
            numBottles = (numBottles%numExchange) + n ;
        }
        return res+temp ;
    }
}

在这里插入图片描述
10-找出数组游戏的玩家
题目链接:题目链接戳这里!!!

思路1:用list集合模拟整个过程,尽管也能AC,但是效率较低。

class Solution {
    public int getWinner(int[] arr, int k) {
        int [] res = new int [1000000] ;
        int max = 0 ;
        List<Integer> list = new ArrayList<>() ;
        for(int i=0; i<arr.length; i++){
            list.add(arr[i]) ;
            max = Math.max(max,arr[i]) ;
        }
        while(true){
            if(list.get(0)==max || list.get(1)==max){
                return max ;
            }
            if(list.get(0)>list.get(1)){
                int t = list.get(0) ;
                res[t] ++ ;
                int temp = list.get(1) ;
                list.remove(1) ;
                list.add(temp) ;
                if( res[t]==k){
                    return t ;
                }
            }else{
                int t = list.get(1) ;
                res[t] ++ ;
                int temp = list.get(0) ;
                list.remove(0) ;
                list.add(temp) ;
                if(res[t]==k){
                    return t ;
                }
            }
        }  
    }
}

在这里插入图片描述
11-按既定顺序创建目标数组
题目链接:题目链接戳这里!!!

思路:先更新index数组,在更新结果数组ans。

class Solution {
    public int[] createTargetArray(int[] nums, int[] index) {
       int len = nums.length ;
       int [] ans = new int [len] ;
       for(int i=0; i<len; i++){
           for(int j=0; j<i; j++){
               index[j] += (index[j]>=index[i]) ? 1 : 0 ;
           }
       }
       for(int i=0; i<ans.length; i++){
           ans[index[i]] = nums[i] ;
       }
       return ans ;
    }
}

在这里插入图片描述
12-可以攻击国王的王后
题目链接:题目链接戳这里!!!

思路:模拟过程,是用国王去攻击王后,沿着8个方向攻击,每次只要能攻击到一个就结束当前方向的攻击,如果超过边界仍攻击不到则结束当前方向的攻击。

class Solution {
     int dx[] = {-1, -1, -1, 0, 1, 1, 1, 0};
     int dy[] = {-1,  0,  1, 1, 1, 0,-1,-1};
    public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
        List<List<Integer>> list = new ArrayList<>() ;
        int [][] grid = new int [8][8] ; 
        for(int i=0; i<queens.length; i++){
            grid[queens[i][0]][queens[i][1]] = 1 ;
        }
        for(int i=0; i<8; i++){
            int tx = king[0] + dx[i] ;
            int ty = king[1] + dy[i] ;
            while(tx>=0 && ty>=0 && tx<8 && ty<8){
                if(grid[tx][ty]==1){
                List<Integer> temp = new ArrayList<>() ;
                temp.add(tx) ;
                temp.add(ty) ;
                list.add(temp) ;
                 break ;
                }
                tx += dx[i] ;
                ty += dy[i] ;
            }
        }
        return list ;
    }
}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值