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的主要内容,如果未能解决你的问题,请参考以下文章