DAY2-力扣刷题

1.整数反转

题目链接:7. 整数反转 - 力扣(LeetCode)

解题思路

数值的范围(重点)

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,2^31-1]

也就是说我们不能用long存储最终结果,而且有些数字可能是合法范围内的数字,但是反转过来就超过范围了。

class Solution {
    public int reverse(int x) {
        int res = 0;
        while (x != 0) {// x!=0可以一直循环
            // 末位数取mod
            int tmp = x % 10;
            // 判断是否大于最大32位整数
            // 提前对之前的八位进行判断
            // res是翻转的数,如果前面的已经大于之前的位数了,显然不用进行判断了
            // 如果之前的数都是小于范围的,我们只需要判断个位数
            if (res > 214748364 || (res == 214748364 && tmp > 7)) {
                return 0;
            }
            // 判断是否小于最小32位整数
            if (res < -214748364 || (res == -214748364 && tmp < -8)) {
                return 0;
            }
            res = res * 10 + tmp;
            x = x / 10;// 不要最末尾的数了
        }
        return res;
    }
}

 

2.字符串转成整数(atoi) 

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

方法 1:字符串的转换

Character.isDigit()方法-CSDN博客

Character.isDigit()方法:
Character.isDigit( c ),其中c是字符,这个方法可以用于判断字符c是不是数字形式的字符。

// 字符转数字
// 先把字符转为字符串,再转换为数字
char ch = '5';
String temp = String.valueOf(ch);
int a = Integer.parseInt(temp);
System.out.println(a);
//或者
int a = ch - '0';

class Solution {
    public int myAtoi(String s) {
        int sign=1;
        int res=0;
        int m=s.length();
        int i=0;
        while(i<m&&s.charAt(i)==' '){//循环停止的条件,此时略过前面的空格 
            i++;
        }
        int start=i;
        for(;i<m;i++){
            char c=s.charAt(i);
            //判断符号,为“正负”的情况
            //只有其在首位置才是有效的,否则直接退出
            if(i==start&&c=='+'){
                sign=1;//符号
            }else if(i==start&&c=='-'){
                sign=-1;
            }else if(Character.isDigit(c)){
                int num=c-'0';
                //和上题差不多的步骤,需要进行判断
                if(res>Integer.MAX_VALUE/10||(res==Integer.MAX_VALUE/10&&num>Integer.MAX_VALUE%10)){
                    return Integer.MAX_VALUE;
                }
                //最小值
                if(res<Integer.MIN_VALUE/10||(res==Integer.MIN_VALUE/10&&-num<Integer.MIN_VALUE%10)){
                    return Integer.MIN_VALUE;
                }
                res=num*sign+res*10;
            }else{
                break;
            }
        }
        return res;

    }
}

 

3.回文数

题目链接:9. 回文数 - 力扣(LeetCode)

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数

是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

 方法1:反转一半

class Solution {
    public boolean isPalindrome(int x) {
        //1.当x<0时,bushihuiwenshu
        //  同样地,如果数字的最后一位是 0,为了使该数字为回文,
        //  则其第一位数字也应该是 0
        //  只有 0 满足这一属性
        if(x<0||(x%10==0&&x!=0)){
            return false;
        }
        //整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,
        //所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
        int reversenumber=0;
        while(reversenumber<x){
            reversenumber=reversenumber*10+(x%10);
            x=x/10;
        }
        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x==reversenumber||x==reversenumber/10;
    }
}

方法2:回文字符串(cool)

class Solution4 {
        public boolean isPalindrome(int x) {
            String str=String.valueOf(x);
            StringBuffer stringBuffer=new StringBuffer();
            stringBuffer.append(str);
            return str.equals(stringBuffer.reverse().toString());
        }
    }

4.盛最多水的容器

方法一:暴力求解法

//可以运行出来但是超时了

class Solution {
    public static int maxArea(int[] height) {
        // 1.可以分为两拨进行遍历
        // 计算数组的大小
        int len = height.length;
        int left = 0;
        int right = len - 1;
        int areasave = 0;
        // 开始计算面积
        for (left = 0; left < right; left++) {
            for (right = len - 1; left < right; right--) {
                // 表示总长度
                int row = right - left;
                int area = row * Math.min(height[left], height[right]);
                if (areasave < area) {
                    areasave = area;
                }

            }
            right = len - 1;
        }
        return areasave;

    }
}

方法二:双指针法



class Solution {
    public static int maxArea(int[] height) {
        //双指针法
        int l=0;
        int r=height.length-1;
        int ans=0;
        while(l<r){
            int area=Math.min(height[l],height[r])*(r-l);
            ans=Math.max(ans,area);
            if(height[l]<height[r]){
                l++;
            }else{
                r--;
            }
        }
        return ans;
    }
}

5.整数转罗马数字 

题目链接:12. 整数转罗马数字 - 力扣(LeetCode)

class Solution {
    public static String intToRoman(int num) {
        int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        String[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < values.length; i++) {
            // 对原有的数字进行除法运算,若除不了,则说明没有对应的字符
            // 进行下一次遍历即可
            // 如果可以相除,我们就添加字符串
            int len = num / values[i];
            if (len >= 1) {
                for (int j = 0; j < len; j++) {
                    stringBuffer.append(symbols[i]);
                }
                // 此时数字需要更新
                num = num - len * values[i];
            }
        }
        return stringBuffer.toString();
    }
}

借鉴了该作者的思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值