一.鄙人的解法
需求:回文数
这里写了三种解法
- 比较一半的方式来实现 回文数
- 要StringBuilder实现 回文数
- 转字符串方法实现 回文数
代码
思路写在注释中
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
- 发现自己的思维过于固定,应多多扩展不然只能写最菜的代码
- 算法兴趣+4