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 小结

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

根据引用,可以看出这是一段使用迭代器进行循环遍历的代码,并且遍历的对象是`vector<int>`类型的向量。迭代器`it`初始化为`c.begin()`,结束条件为`it < c.end()`。这段代码中省略了循环体,需要根据具体上下文来确定循环体的具体操作。 根据引用,我们可以了解到`vector`是一种动态数组,可以存储多个相同类型的元素。代码示例中用`assign`函数将另一个向量的一部分元素赋值给目标向量。具体来说,`a.assign(b.begin(), b.begin()+3)`意味着将向量`b`的前三个元素赋值给向量`a`。 根据引用,可以看出这是一段关于在VSCode中安装leetcode插件和配置的说明文档。文档中提到了如何安装插件、如何编译和构建代码等内容。 综上所述,LeetCode的`vector`是一种动态数组,可以存储多个相同类型的元素。可以通过迭代器对其进行循环遍历,也可以使用成员函数`assign`来赋值部分元素。在VSCode中,可以安装LeetCode插件并进行相关配置来进行编译和构建。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++LeetCode每日一题 Day3 常用容器vector的使用](https://blog.csdn.net/m0_75276704/article/details/129737396)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [vscode安装leetcode-Leetcode:力码](https://download.csdn.net/download/weixin_38557935/20051243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值