算法4:回文数

一.鄙人的解法

需求:回文数

这里写了三种解法

  1. 比较一半的方式来实现 回文数
  2. 要StringBuilder实现 回文数
  3. 转字符串方法实现 回文数

代码

思路写在注释中

public class WzwTest
{
    /**
     * 解算法 回文数
     */
    public static void main(String[] args)
    {
        // 输入:x = 121
        int x = 120020;
        
        // 方法1:比较一半的值
        boolean compareHalf = getCompareHalf(x);
        System.out.println("compareHalf = " + compareHalf);

        // 方法2:要StringBuilder实现 回文数
        boolean bigInt = getBigInt(x);
        System.out.println("bigInt = " + bigInt);

        // 方法3:转字符串方法实现 回文数
        boolean isBackBody = getIsBackBody(x);
        System.out.println("isBackBody = " + isBackBody);

    }

    /**
     * 比较一半的方式来实现 回文数
     * @param x 
     * @return
     */
    private static boolean getCompareHalf(int x)
    {
        /**
         * || 有真全真   && 有假全假
         * x < 0        表示其x都是负数,都返回false
         * x != 0       表示0也算是答案
         * x % 10 == 0  表示个位数是0
         * 这样就必须要求第一个数是0,这个除了0都是不可能的
         * 例子: 没有012210 这样的数
         * 总结:除0以外,其他数的首位是0的话,返回false
         */
        if (x < 0 || (x != 0 && x % 10 == 0))
        {
            return false;
        }
        // 用于存低位翻转的数
        int nums = 0;
        /**
         * 如果被取模后的x > nums的时候说明,两个数没达到对等的条件
         * 如果 x 都大于 nums 的话,那nums就绝对不可能等于x  (要这个的原因是性能小,只要做判断他大于就可以)
         * 如果 x 小于或等于 nums  的话就符合要求了
         * 例子:以121为例
         * 121 > 0      true
         * 12 > 1       true
         * 1 > 12       false
         */
        while (x > nums)
        {

            // 0 * 10 + 121 % 10 = 1
            // 1 * 10 + 12 % 10 = 12
            nums += nums * 10 + x % 10;
            // 121 / 10 = 12
            // 12 / 10 = 1
            x /= 10;
        }
        /**
         *  如果 低位翻转的一半 比较 高位的一半 或者
         *  出现奇数情况 需要除10,去掉多余的数,在进行高低位比较\
         *  只要有一个比较相等的话 就说明是回文数
         */
        return nums == x || (nums / 10) == x ;
    }

    /**
     * 要StringBuilder实现 回文数
     * @param x
     * @return
     */
    private static boolean getBigInt(int x)
    {
        // 将整数转为string放入StringBuilder中进行翻转后转回string并比较原来的值
        return new StringBuilder(String.valueOf(x)).reverse().toString().equals(x + "");
    }

    /**
     * 转字符串方法实现 回文数
     * @param x
     * @return
     */
    private static boolean getIsBackBody(int x)
    {
        // 将数字转为字符串在转为字符数组
        char[] array = (x + "").toCharArray();
        // 声明一个string存储翻转
        String isBackbody = "";
        // 倒着遍历让其字符颠倒
        for (int length = array.length - 1; length >= 0; length--)
        {
            // 颠倒数据
            isBackbody += array[length];
        }
        // 比较翻转前后的字符串
        return isBackbody.equals(x + "");
    }
}

作者:王子威

总结

  1. 学习了回文数
  2. 对%的运用熟练度+1
  3. 发现自己的思维过于固定,应多多扩展不然只能写最菜的代码
  4. 算法兴趣+4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值