leetcode之模拟刷题总结1

Posted nuist__NJUPT

tags:

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

leetcode之模拟刷题总结1

1-字符串相乘
题目链接:题目链接戳这里!!!

第一思路:用BigInteger来处理大数,但是题目要求不允许使用BigInteger,哈哈

用BigIntger的AC代码如下:

import java.math.BigInteger ;
class Solution 
    public String multiply(String num1, String num2) 
        BigInteger s1 = new BigInteger(num1) ;
        BigInteger s2 = new BigInteger(num2) ;
        return s2.multiply(s1).toString() ;
    


这题考的是模拟,我们呢看一下,就是模拟每一位数依次相乘,然后错位相加的过程,可以看一下下面的图,就是1234与567相乘的计算过程。

AC代码如下:

class Solution 
    public String multiply(String num1, String num2) 
        if(num1.equals("0") || num2.equals("0"))
            return "0" ;
        
        int n1 = num1.length() ;
        int n2 = num2.length() ;
        String res = "0" ;
        StringBuilder str = new StringBuilder() ;
        List<String> list = new ArrayList<>() ;
        for(int i=n1-1; i>=0; i--)
            String s = "" ;
            int ans = 0 ;
            for(int j=n2-1; j>=0; j--)
                int temp = (num1.charAt(i)-'0')*(num2.charAt(j)-'0') ;
                if(ans > 0)
                    temp += ans ;
                    ans = 0 ;
                
                if(temp>=10 && j!=0)
                    ans = temp / 10 ;
                    s += temp % 10 ;
                else
                    if(temp<10)
                    s += temp ;
                    else
                        s += temp%10 ;
                        s += temp/10 ;
                    
                
            
            str = new StringBuilder(s) ;
            s = str.reverse().toString() ;
            for(int k=n1-1; k>i; k--)
                s+= "0" ;
            
            res = add(res, s) ;
        
        return res;
    
    public String add(String num1, String num2)
       int i=num1.length()-1, j = num2.length()-1, add=0 ;
       StringBuilder ss = new StringBuilder() ;
       while(i>=0 || j>=0 || add!=0)
           int x = i>=0 ? (num1.charAt(i)-'0') : 0 ;
           int y = j>=0 ? (num2.charAt(j)-'0') : 0 ;
           int result = x + y + add ;
           add = result / 10 ;
           ss.append(result%10) ;
           i -- ;
           j -- ;
       
       return ss.reverse().toString() ;
    


2-字符串相乘
题目链接:题目链接戳这里!!!

第一思路:这题直接用BigIntger,分分钟解决,不过题目说了不要用,那就是要模拟这个相加的过程。

import java.math.BigInteger ;
class Solution 
    public String addStrings(String num1, String num2) 
        BigInteger s1 = new BigInteger(num1) ;
        BigInteger s2 = new BigInteger(num2) ;
        return s1.add(s2).toString() ;
    


模拟过程就是每一位相加,大于10的进位。

class Solution 
    public String addStrings(String num1, String num2) 
        int i=num1.length()-1, j=num2.length()-1, add = 0 ;
        StringBuilder s = new StringBuilder() ;
        while(i>=0 || j>=0 || add!=0)
            int x = i>=0 ? (num1.charAt(i)-'0') : 0 ;
            int y = j>=0 ? (num2.charAt(j)-'0') : 0 ;
            int result = x + y + add ;
            add = result / 10 ;
            s.append(result%10) ;
            i -- ;
            j -- ;
        
        return s.reverse().toString() ;
    


3-各位相加
题目链接:题目链接戳这里!!!

循环暴力法:

class Solution 
    public int addDigits(int num) 
        int sum = 10 ;
        while(sum>9)
            sum = 0 ;
        while(num!=0)
            sum += num%10 ;
            num /= 10 ;
        
        num = sum ;
    
        return sum ;
    


递归法:

class Solution 
    public int addDigits(int num) 
        if(num<10)
            return num ;
        
        int sum = 0 ;
        while(num != 0)
            sum += num% 10 ;
            num = num/10 ;
        
        return addDigits(sum) ;
    

模拟:一句代码搞定,O(1)时间复杂度

class Solution 
    public int addDigits(int num) 
        return (num-1)%9+1 ;
    

4-螺线矩阵
题目链接:题目链接戳这里!!!

思路:定义上下左右四个方向的边界,模拟移动过程,并更新边界,直到全部走完所有的矩形块。

题目不难,但是细节慢慢。

AC代码如下:

class Solution 
    public List<Integer> spiralOrder(int[][] matrix) 
        int top = 0, bottom = matrix.length-1, left =0, right = matrix[0].length-1;
        List<Integer> list = new ArrayList<>() ;
        while(true)
            for(int i=left; i<=right; i++)
                list.add(matrix[top][i]) ;
            
            top++ ;
            if(top>bottom)
                break ;
            
            for(int i=top; i<=bottom; i++)
                list.add(matrix[i][right]) ;
            
            right -- ;
            if(left>right)
                break ;
            
            for(int i=right; i>=left; i--)
                list.add(matrix[bottom][i]) ;
            
            bottom -- ;
            if(bottom<top)
                break ;
            
            for(int i=bottom; i>=top; i--)
                list.add(matrix[i][left]) ;
            
            left ++ ;
            if(left>right)
                break ;
            

        
        return list ;
    


5-螺线矩阵II
题目链接:题目链接戳这里!!!

思路:这题和上题思路一样,都是定义四个边界,模拟螺旋矩阵的生成的过程。

AC代码如下:

class Solution 
    public int[][] generateMatrix(int n) 
        int top=0, bottom=n-1, left=0, right=n-1;
        int [][] res = new int [n][n] ;
        int idx = 1 ;
        while(idx <= n*n)
            for(int i=left; i<=right; i++)
                res[top][i] = idx++ ;
            
            top ++ ;
            for(int i=top; i<=bottom; i++)
                res[i][right] = idx++ ;
            
            right -- ;
            for(int i=right; i>=left; i--)
                res[bottom][i] = idx++ ;
            
            bottom -- ;
            for(int i=bottom; i>=top; i--)
                res[i][left] = idx++ ;
            
            left ++ ;
        
        return res ;
    


6-生命游戏
题目链接:题目链接戳这里!!!

思路:这题也是标准的模拟,先将数组board全部复制给数组ans,我们对每个点模拟出8个方向,通过判断8个方向的值,修改ans数组,最后再将ans数组的值全部复制给board即可。

AC代码如下:

class Solution 
    public void gameOfLife(int[][] board) 
        int [] x = -1,-1,-1,0,0,1,1,1 ;
        int [] y = -1,0,1,-1,1,-1,0,1 ;
        int [][] ans = new int [board.length][board[0].length] ;
        for(int i=0; i<ans.length; i++)
        for(int j=0; j<ans[0].length; j++)
            ans[i][j] = board[i][j] ;
        
    
        int cnt ;
        for(int i=0; i<board.length; i++)
            for(int j=0; j<board[0].length; j++)
                 cnt = 0 ;
                for(int k=0; k<8; k++)
                    int nx = i + x[k] ;
                    int ny = j + y[k] ;
            if(nx>=0 && nx<board.length && ny>=0 && ny<board[0].length && board[nx][ny]==1)
                cnt ++  ;
                
            
            if(cnt<2)
                ans[i][j] = 0 ;
            else if(cnt>3)
                ans[i][j] = 0 ;
            else if(cnt==3)
                ans[i][j] = 1 ;
            
        
    
    for(int i=0; i<ans.length; i++)
        for(int j=0; j<ans[0].length; j++)
            board[i][j] = ans[i][j] ;
        
    
    



7-二进制求和
题目链接:题目链接戳这里!!!

思路:这题也是模拟,模拟二进制相加的过程即可,和模拟整数相加的过程很像,二进制每一位相加得到的结果为0或者1不需要进位,要是结果为2或者3则需要进位。

AC代码如下:

class Solution 
    public String addBinary(String a, String b) 
        StringBuilder res = new StringBuilder() ;
        int i = a.length()-1, j=b.length()-1, add=0 ;
       
        while(i>=0 || j>=0 || add!=0)
            int x = i>=0 ? (a.charAt(i)-'0') : 0 ;
            int y = j>=0 ? (b.charAt(j)-'0') : 0 ;
            int result = x + y + add ;
            if(result==0 || result==1)
                res.append(result) ;
                add = 0 ;
            else if(result<

以上是关于leetcode之模拟刷题总结1的主要内容,如果未能解决你的问题,请参考以下文章

leetcode之模拟刷题总结3

leetcode之模拟刷题总结2

leetcode之分治刷题总结1

LeetCode刷题日记之盛最多水的容器

leetcode之回溯刷题总结1

leetcode之贪心算法刷题总结1