Day2 LeetCode 7 8 9

LeetCode刷题第二天  7/8/9题

目录

LeetCode刷题第二天  7/8/9题

1. 整数反转(LeetCode 7 题)

1.1题目

1.2思路

1.3代码

2.字符串转换整数(LeetCode 8 题)

2.1 题目

2.2 思路

2.3 代码

2.4 小结

 3.回文数

3.1 题目

3.2 思路与代码

3.3 小结


1. 整数反转(LeetCode 7 题)

1.1题目

1.2思路

说一下思路,就是把整数通过取余然后对这个余数进行重组。

不过里面有个小坑,就是溢出的问题,比如2^31这样正好翻转过来溢出了 ,这个问题也很好解决。

倘若你计算的数字最后一位和反转过来的第一位不一样,不就说明溢出了。(因为数字溢出就是超过范围,然后重新排列数字。)

也就是利用这个方法即可完成溢出判断,题目说给零。

1.3代码

public class mainDemo {
    public static void main(String[] args) {
        System.out.println(reverse((int)Math.pow(2,31)));
    }
    public static int reverse(int x) {
        int k = 0,p=1,xfirst= 0;
        if (x<0){
            p=-1;
            x = -x;
        }
        while (x>0){
            k = x%10+k*10;
            if (x<10) xfirst = x;
            x = x/10;
        }
        if (xfirst==k%10) return k*p;
        else return 0;
    }
}

2.字符串转换整数(LeetCode 8 题)

2.1 题目

2.2 思路

我们说一下这个题的思路:

首先我们要把字符串转为数字,那么我们需要的就是把字符遍历,然后首先获取符号,接着对每个字符进行转换。之后将后面有数字进行判断是否越界,最后得到我们的数字。

上面是最基本的思路。

但是还有一些特殊情况。

“  -41” 这个符号前面带空格的,应该把它跳过。

“  - 41” 如果符号后面有空格这个数字就有问题,应该直接为0。

“ -41 ABC”数字输入完成应该直接结束。

“ -91283472332”这样大于边界的数应该得到有效判定,而且正负值的判定边界绝对值不同,因此还需要区别对待!

“+-21”这样双符号也应该判为零

“A-26”这不符合直接返回零

我们说一下解决上面特殊情况的思路。

首先“  -41” 这个问题应该略过“ ”直接对符号判断,同时“ -91283472332”情况应该对符号进行存储。“A-26”这样无关的符号直接返回。“ -41”同时我们的“0-9”也应该被有效记录。而“+-”、“-  41”这样的情况我们可以在付好后加标志位,一旦开始记录后面必须为“0-9”。这些是对我们符号的判断。

其次,就是我们对越界问题的思考,如果数字过大,越界了怎么判断。我们应该对“+、-”符号放入判断条件。然后和边界进行对比。

但是问题来了,边界值又不能直接比较,(在都是用int的情况)。所以我这里采用max/10判断,首先判断出去整数的位数大小,缩小范围免得提前超范围导致计算不准确。接着采用较个位数和符号的方法判断。

2.3 代码

说完思路我们看看我怎么实现的。不够优雅,因为思考的不够全面!

package com.day2.test1;

public class atoi {
    public static void main(String[] args) {
        System.out.println(myAtoi("+ 452"));
    }
    public static int myAtoi(String s) {
        final int MAX = (int)Math.pow(2,31);
        final int MIN = (int)Math.pow(-2,31);
        char index = ' ';
        int start= 0;
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i)==' '){
                if (start==1) break;
                continue;
            }
            if (s.charAt(i)=='-'||s.charAt(i)=='+'){
                if (index=='+'||index=='-'||start==1) break;
                index=s.charAt(i);
                start=1;
                continue;
            }
            if (s.charAt(i)<='9'&&s.charAt(i)>='0'){
                start = 1;
                if (sum==MAX/10 ){
                    if (s.charAt(i)>'6'&&(index=='+'||index==' ') ){
                        sum =MAX;
                        break;
                    }else if (s.charAt(i)>'7'&& index=='-'){
                        sum = MIN;
                        break;
                    }
                }else if (sum>MAX/10) {
                    sum = index=='-'?MIN:MAX;
                    break;
                }
                sum = sum*10+s.charAt(i)-'0';
            }else break;
        }
        if (sum==MIN)return  sum;
        sum = index=='-'?sum*(-1):sum;
        return sum;
    }
}

2.4 小结

不得不说这个题需要思考很多,感觉自己经验不够,尝试很多次,然后每一次都有新问题。但是觉得自己进步了好多。慢慢来,用debug调试,效率很高。

拿出来句话激励自己:

我不怕犯错,就怕什么也不做。

 3.回文数

3.1 题目

3.2 思路与代码

这个题其实就是昨天题目的餐前甜点。不过还是有一些好方法值得说明的。这里写一些思路。

#方法一  首先是最短代码,一行解决。 就是int转为str,然后进行反转和比较。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x)==str(x)[::-1]

#方法二  接下来是我第一次自己写的代码,其实也用到了列表,用了一个arraylist,然后进行判断。时间复杂度精确的算应该是n*1.5

# 就是首先将字符转为列表 然后将列表头尾取双指针,进行递减比较,如果双指针的大小替换,说明正常跳出循环。(就是这里需要注意,如果是负数可以直接pass)


        boolean isfushu = x<0?true:false;
        if (isfushu) return false;
        else{
            ArrayList<Integer> a = new ArrayList<Integer>();
            while (x>0){
                   a.add(x%10);
                   x = x/10;
            }
            int i=0,j=a.size()-1;
            while (i<j){
                if (a.get(i)!=a.get(j))return false;
                i++;
                j--;
            }
            if (i>=j) return true;
        }
        return false;

# 方法三 这个方法我觉得比较可取

# 就是通过对我们int数字取反,然后进行int之间的比较即可。时间复杂度为n+1。

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0) return false;
        else{
            int xp=x,y=0;
            while(xp>0){
                y = xp%10+y*10;
                xp =  xp/10;
            }
            if(y==x) return true;
        }
        return false;
    }
}

3.3 小结

题目虽然简单,但是也需要认真对待。各种方法进行尝试得到最好的解,让自己进步才是本次参加训练的最终目的!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值