算法一年级之回文数

题目

如果把某个数的各个数字按相反的顺序排列,得到的数和原来的数相同,则这个数就是“回文数”。譬如123454321就是一个回文数。

思路

在这里插入图片描述
如图;对于十进制数转二进制数;循环取余商作为新的除数;最后的 余数倒序

偷懒

  1. 既然十进制数也要求必须左右对称,那么不必 i++;直接给数 “11,22,101,252”之类的数;不过麻烦也就麻烦在这了!

代码

//产生左右对称的十进制数
private static void reverseNum() {
    for (int j = 1; j < 9; j++) {
        StringBuilder stringBuilder = new StringBuilder("");
        int target = 0;
        for (int i = 0; i < 9; i++) {
            stringBuilder.append(j).append(i).append(j);
            target = Integer.valueOf(stringBuilder.toString());

            if (compare28(target)) {
                System.out.println(target);
                break;
            }
            stringBuilder.setLength(0);
        }
    }
}

//获取其 2 进制及 8 进制数;并进行对比。
private static boolean compare28(int target) {
    //二进制
    StringBuilder jinzhi2 = new StringBuilder("");
    int temp2 = 0;
    int shang = 0;
    int tempTarget = target;
    while (true) {
        shang = tempTarget / 2;
        temp2 = tempTarget % 2;
        jinzhi2.append(temp2);
        tempTarget = shang;
        if (shang == 0) {
            break;
        }
    }
    jinzhi2.reverse();

    boolean is2 = true;
    for (int k = 0; k < jinzhi2.length(); k++) {
        if (jinzhi2.charAt(k) != jinzhi2.charAt(jinzhi2.length() - 1 - k)) {
            is2 = false;
            break;
        }
    }

    if (!is2) return false;

    //八进制
    StringBuilder jinzhi8 = new StringBuilder("");
    int temp8 = 0;
    int shang8 = 0;
    int tempTarget8 = target;
    while (true) {
        shang8 = tempTarget8 / 8;
        temp8 = tempTarget8 % 8;
        jinzhi8.append(temp8);
        tempTarget8 = shang8;
        if (shang8 == 0) {
            break;
        }
    }
    jinzhi8.reverse();

    int is8 = 0;
    for (int k = 0; k < jinzhi8.length(); k++) {
        if (jinzhi8.charAt(k) != jinzhi8.charAt(jinzhi8.length() - 1 - k)) {
            is8 = -1;
            break;
        }
        if (k == jinzhi8.length() / 2) {
            is8++;
        }
    }

    jinzhi2.setLength(0);
    jinzhi8.setLength(0);

    return (is8 > 0);
}

问题

这里产生左右对称的十进制数时,是手动的,新产生了2位数,没有结果又产生了三位数,……这不是最优解;值得思考。

思考

  1. 这里我傻了;10进制转2进制数;不必自己算,
  2. 10 → 2 String s = Integer.toBinaryString(num);
  3. 10 → 8 String s = Integer.toOctalString(num);
  4. 10 → 16 String s = Integer.toHexString(num);
  5. 所以只需要判断:(num.toString(8) == num.toString(8).reverse())即可;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liusaisaiV1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值