leetcode之模拟刷题总结2

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之模拟刷题总结2相关的知识,希望对你有一定的参考价值。

leetcode之模拟刷题总结2

1-重塑矩阵
题目链接:题目链接戳这里!!!

思路:模拟矩阵重塑过程,如果原始矩阵和重塑矩阵的元素个数不同,则不能完成重塑,反之,可以完成重塑,先把原始矩阵转换一维数组,再将一维数组转换为重塑矩阵。

AC代码如下:

class Solution 
    public int[][] matrixReshape(int[][] mat, int r, int c) 
        if(r*c!=mat.length*mat[0].length)
            return mat ;
        
        int [] temp = new int [r*c] ;
        int idx = 0 ;
        int [][] res = new int [r][c] ;
        for(int i=0; i<mat.length; i++)
            for(int j=0; j<mat[0].length; j++)
                temp[idx++] = mat[i][j] ;
            
        
        idx = 0 ;
        for(int i=0; i<r; i++)
            for(int j=0; j<c; j++)
                res[i][j] = temp[idx++] ;
            
        
        return res ;
    


也可以这样写,直接将二维矩阵转换成对应的二维矩阵,效率更高。

class Solution 
    public int[][] matrixReshape(int[][] mat, int r, int c) 
        if(r*c!=mat.length*mat[0].length)
            return mat ;
        
        int [][] res = new int [r][c] ;
        for(int i=0; i<r*c; i++)
            res[i/c][i%c] = mat[i/mat[0].length][i%mat[0].length] ;
        
        return res ;
    


2-Fizz Buzz
题目链接:题目链接戳这里!!!

思路:很水的题,直接判断,加入集合就可以。

class Solution 
    public List<String> fizzBuzz(int n) 
        List<String> list = new ArrayList<>() ; 
        for(int i=1; i<=n; i++)
            if(i%3==0 && i%5==0)
                list.add("FizzBuzz") ;
            else if(i%3==0)
                list.add("Fizz") ;
            else if(i%5==0)
                list.add("Buzz") ;
            else
                list.add(String.valueOf(i)) ;
            
        
        return list ;
    


3-求解方程
题目链接:题目链接戳这里!!!

思路:将字符串所有“-”符号前面添加“+“,然后按照等号将字符串划分成两段,左边的和右边的都按照”+“划分成字符串数组,然后对左右两个字符串进行处理,根据系数判断有无解。

AC代码如下:

class Solution 
    public String solveEquation(String equation) 
        int idx = 0 ;
    
        for(int i=0; i<equation.length(); i++)
            if(equation.charAt(i)=='-')
                equation = equation.substring(0,i) + "+" + equation.substring(i) ;
                i++ ;
            
        
         for(int i=0; i<equation.length(); i++)
            if(equation.charAt(i)=='=')
                idx=i ;
            
        
     
        String left = equation.substring(0,idx) ;
        String right = equation.substring(idx+1,equation.length()) ;
        String [] l = left.split("[+]") ;
        String [] r = right.split("[+]") ;
        int a1=0, a2=0, b1=0, b2=0 ;

            for(int i=0; i<l.length; i++)
            if( !l[i].equals("") && !contains(l[i]) )
                a1 += Integer.parseInt(l[i]) ;
            else if(!l[i].equals("") && contains(l[i]))
                if(l[i].length()==1)
                    b1 += 1 ;
                else if(l[i].length()==2 && l[i].charAt(0)=='-')
                    b1 -= 1 ;
                
                else
                b1 += Integer.parseInt(l[i].substring(0,l[i].length()-1)) ;
                
            
        
        for(int i=0; i<r.length; i++)
            if(!contains(r[i]) && !r[i].equals(""))
                a2 += Integer.parseInt(r[i]) ;
            else if(contains(r[i]) && !r[i].equals(""))
                if(r[i].length()==1)
                    b2 += 1 ;
                else if(r[i].length()==2 && r[i].charAt(0)=='-')
                    b2 -= 1 ;
                
                else
                b2 += Integer.parseInt(r[i].substring(0,r[i].length()-1)) ;
                
            
        
        if(b1!=b2)
            return "x=" + (a2-a1)/(b1-b2) ;
        else if(a1!=a2)
            return "No solution" ;
        else
            return "Infinite solutions" ;
        
    
    public boolean contains(String s)
        if(s.equals(""))
            return false ;
        
       if(s.charAt(s.length()-1)=='x')
           return true ;
       
       return false ;
    


4-机器人能否返回原点
题目链接:题目链接戳这里!!!

思路:记录U,D,R,L的个数,当且仅当U等于D且R等于L时候,可以 返回到原点,否则,不能返回到原点。

class Solution 
    public boolean judgeCircle(String moves) 
        int cntU=0, cntD=0, cntL=0, cntR=0 ;
        for(int i=0; i<moves.length();i++)
            if(moves.charAt(i)=='U')
                cntU ++ ;
            else if(moves.charAt(i)=='D')
                cntD ++ ;
            else if(moves.charAt(i)=='L')
                cntL ++ ;
            else if(moves.charAt(i)=='R')
                cntR ++ ;
            
        
      return cntR==cntL && cntD==cntU ;
    


5-模拟机器人行走
题目链接:题目链接戳这里!!!

思路:用set集合存储障碍物坐标,定义四个方向,根据命令模拟运动,同时计算最大欧式距离。

AC代码如下:

class Solution 
    public int robotSim(int[] commands, int[][] obstacles) 
        Set<String> set = new HashSet<>() ;
        for(int [] obstacle : obstacles) //set集合存储障碍物坐标
            set.add(obstacle[0]+","+obstacle[1]) ;
        
        //定义北,东,南,西四个方向
        int [] dx = 0,1,0,-1 ;
        int [] dy = 1,0,-1,0 ;
        int cur=0, x=0, y=0;
        int tx, ty ;
        int ans = 0 ;
        for(int command:commands)
            if(command>0)
                for(int i=0; i<command; i++)
                    tx = x + dx[cur] ;
                    ty = y + dy[cur] ;
                    if(set.contains(tx+","+ty))
                        break ;
                    
                    x = tx ;
                    y = ty ;
                    ans = Math.max(ans,x*x+y*y) ;
                
            else
                cur = command==-1 ? (cur+1)%4 : (cur+3)%4 ; 
            
        
        return ans ;

    


6-棒球比赛
题目链接:题目链接戳这里!!!

思路1:转换成list结果完成相应的操作。
由于类型的转换较多,效率不是很高。

class Solution 
    public int calPoints(String[] ops) 
        List<String> list = new ArrayList<>() ;
        for(int i=0; i<ops.length; i++)
          list.add(ops[i]) ;
        
        for(int i=0; i<list.size(); i++)
            if(list.get(i).equals("C"))
                list.remove(i) ;
                list.remove(i-1) ;
                i -= 2 ;
            else if(list.get(i).equals("D"))
                int value = Integer.parseInt(list.get(i-1))*2 ;
                list.set(i,String.valueOf(value)) ;
            else if(list.get(i).equals("+"))
                int sum = Integer.parseInt(list.get(i-1))+Integer.parseInt(list.get(i-2)) ;
                list.set(i,String.valueOf(sum)) ;
            
        
        int s = 0 ;
        for(int i=0; i<list.size(); i++)
            s += Integer.parseInt(list.get(i)) ;
        
        return s ;
    


思路2:直接用整数数组记录,效率提升了很多。

class Solution 
    public int calPoints(String[] ops) 
       int [] res = new int [ops.length] ;
       int sum = 0 ;
       int j = 0 ;
       for(int i=0; i<ops.length; i++)
           switch(ops[i])
               case "C": res[j-1]=0 ;j--; break ;
               case "D":res[j] = 2*res[j-1]以上是关于leetcode之模拟刷题总结2的主要内容,如果未能解决你的问题,请参考以下文章

leetcode之模拟刷题总结3

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

leetcode之贪心算法刷题总结2

leetcode之回溯刷题总结2

LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)

leetcode之前缀和刷题总结2