7. 整数反转
方法一:数学
·1)先不考虑反转后的溢出,通过模10不断拿到最后一位数
2)考虑生成的数大于等于214748364 或小于等于-214748364 时可能发生溢出的情况,直接返回
class Solution {
public int reverse(int x) {
int prev=0;
while(x!=0){
//解决溢出
if(prev>214748364 ||(prev==214748364&&x%10>7)){
return 0;
}
if(prev<-214748364 ||(prev==-214748364 && x%10<-8)){
return 0;
}
//先不考虑溢出,得出反转后数字
prev=prev*10+x%10;//在循环中不断拿到后一位数字
x/=10; //每拿到一位数修改要处理的值
}
return prev;
}
}
时间复杂度:O(1)
方法二:字符串反转
9.回文数
方法一:在第七题基础上考虑负数直接返回false即可。
class Solution {
public boolean isPalindrome(int x) {
int prev=0;
int rec=x;
if(x<0)
return false;
while(rec!=0){
if(prev>214748364 ||(prev==214748364 && rec%10>7))
return false;
prev=prev*10+ rec%10;
rec/=10;
}
if(prev!=x)
return false;
return true;
}
}
方法二:只反转一半:prev不断增大,x不断减小,当prev>=x时反转一半。此时,数字个数为偶数时判断相等;个数为奇数时,prev/10后判断相等(12321–》 123 ,21)
class Solution {
public boolean isPalindrome(int x) {
if(x<0)
return false;
if(x==0)
return true;
int prev=0;
//prev逐渐增大,x逐渐减小,在prev<x时不断在prev后添加新数,当prev>=x时反转了一半
while(prev<x){
prev=prev*10+ x%10;
x/=10;
}
return (prev==x||(prev/10)==x)?true:false;
}
}
时间复杂度:O(log(x))
13. 罗马数字转整数
import java.util.*;
class Solution {
public int romanToInt(String s) {
//从左向右比较字符,紧邻两字符 左小为负值 左大为正值,最后一个字符无法再向后比较且为正值
int prev=getValue(s.charAt(0));//取第一个字符值
int sum=0;int rec;
for(int i=1;i<s.length();i++){
rec=getValue(s.charAt(i));
if(prev<rec){
sum-=prev;
}else{
sum+=prev;
}
prev=rec;//比较完后移动prev(修改prev)
}
sum+=prev;//获取最后一个字符代表的数值
return sum;
}
private int getValue(char ch){
switch(ch){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D': return 500;
case 'M':return 1000;
default:return 0;
}
}
}
67.二进制求和
方法一
class Solution {
public String addBinary(String a, String b) {
int i=a.length()-1;
int j=b.length()-1;
int carry=0;//进位
StringBuilder builder=new StringBuilder();
//可以同位相加的部分
while(i>=0&&j>=0){
int sum=carry;//加上进位
sum+=a.charAt(i--)-'0'; //减成int类型
sum+=b.charAt(j--)-'0';
carry=sum/2;
builder.append(sum%2);
}
while(i>=0){
int sum=carry;//加上进位
sum+=a.charAt(i--)-'0'; //减成int类型
carry=sum/2;
builder.append(sum%2);
}
while(j>=0){
int sum=carry;//加上进位
sum+=b.charAt(j--)-'0';
carry=sum/2;
builder.append(sum%2);
}
if(carry==1){
builder.append(1);
}
return builder.reverse().toString();
}
}
好菜啊。。。。。
方法二:位运算
69.x的平方根
在二分查找的过程中找到符合(long)mid*mid<=x的mid最大值即可
方法一: 二分查找
```java
class Solution {
public int mySqrt(int x) {
int l=0,r=x,ans=-1,mid;
while(l<=r){ //x=0需要=
mid=(l+r)/2;
if((long)mid*mid<=x){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
return ans;
}
}
时间复杂度:O(logn)
再水一篇,先完成再完美。