leetcode之模拟刷题总结3

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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以上是关于leetcode之模拟刷题总结3的主要内容,如果未能解决你的问题,请参考以下文章

leetcode之数论与模拟刷题总结1

leetcode之模拟刷题总结2

leetcode之贪心算法刷题总结3

leetcode之动态规划刷题总结3

leetcode之回溯刷题总结3

leetcode之深度优先搜索刷题总结3