leetcode 9.回文数

日常刷题

leetcode 9.回文数

难度指数:✯

题目:

给你一个数 x ,如果 x 是一个回文整数,返回 true ; 否则,返回 false 。回文数是指正序 (从左向右) 和倒序 (从右向左) 读都是一样的整数
例如,121 是回文,而 123 不是
示例 1:
输入: X = 121
输出: true
示例 2
输入:x = -121
输出: false
解释: 从左向右读,为 -121 。 从右向左读,为 121- 。因此它不是一个回文数
示例 3:
输入:X=10
输出: false
解释: 从右向左读,为 01 。因此它不是一个回文数
进阶:你能不将整数转为字符串来解决这个问题吗?

分析:

第一反应使用 转字符串,不考虑线程安全问题,选择StringBuild类,使用reverse方法,和原字符串比较 可行,但效率上差了点

不转字符串类型,使用算术运算符 % 和 /
% 取余运算 如 10 % 3 == 1
/ 除法运算 如 10 / 3 == 3
先排除负数和尾数为0的数(不包括 0) 然后把前一半数和后一半数进行比较,具体如下
一直循环用 x % 10拿到最后一位 ,乘 10 相加 得到反转后的数
原数进行 / 10 进行下一次循环的x值
当 前一半值小于后一半值,跳出循环,进行比较

答题:

转字符串方式:

 public boolean isPalindrome(int num) {
        String str = String.valueOf(num);
        StringBuilder sb = new StringBuilder(str);
        String res = sb.reverse().toString();
        return str.equals(res);
    }

不转字符串方式:

 public boolean isPalindrome(int num) {

        if (num < 0 || (num % 10 == 0 && num != 0)) {
            return false;
        }

        int reverseNum = 0;
        while (num > reverseNum) {
            reverseNum = reverseNum * 10 + num % 10;
            num /= 10;
        }
        return num == reverseNum || num == reverseNum / 10;
    }

拓展:

StringBuilder 类的 reverse方法源码:

public AbstractStringBuilder reverse() {
        boolean hasSurrogates = false;
        int n = count - 1;
        for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
            if (Character.isSurrogate(cj) ||
                Character.isSurrogate(ck)) {
                hasSurrogates = true;
            }
        }
        if (hasSurrogates) {
            reverseAllValidSurrogatePairs();
        }
        return this;
    }

    /** Outlined helper method for reverse() */
    private void reverseAllValidSurrogatePairs() {
        for (int i = 0; i < count - 1; i++) {
            char c2 = value[i];
            if (Character.isLowSurrogate(c2)) {
                char c1 = value[i + 1];
                if (Character.isHighSurrogate(c1)) {
                    value[i++] = c1;
                    value[i] = c2;
                }
            }
        }
    }

本质是字符转换,即:

private String reverse(String str) {
        char[] chars = str.toCharArray();
        int n = chars.length - 1;
        for (int i = 0; i < chars.length / 2; i++) {
            char temp = chars[i];
            chars[i] = chars[n - i];
            chars[n - i] = temp;
        }
        return new String(chars);
    }

复习一下逻辑运算符:
在这里插入图片描述
复习下位运算符:
在这里插入图片描述
复习下运算优先级:
单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值

总结:

基础运算符使用熟练的话,省去转成字符串类型计算,效率会有提升

基础要牢固~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值