算法两则Java:判断回文数与反转数字

目录

判断回文数

实现思路

代码展示

代码讲解

反转数字

实现思路

代码展示

代码讲解


判断回文数

实现思路

什么是回文数呢?回文数就是正着写反着写都一样的数,比如1991,12321,101,他们都是回文数,反之,像1234这样的数就不是回文数。

那如何判断一个数是回文数呢?相信大家可能有一些想法了:既然正着读反着读一样,能不能把目标数字写成一个数组arr,每一个阿拉伯数字为一个元素,这样我们通过判断arr[arr.length-1-i]是否等于arr[i]就好了。比如这里有数字1991,我们可以先把它转换成字符串,再转换成字符数组arr={'1', '9', '9', '1'}。遍历arr,判断arr[0]是否等于arr[3-0];arr[1]是否等于arr[3-1]。如果都等于,那返回true,表明这是一个回文数,否则返回false。这样我们就完成了回文数的判断


.代码展示

package advance.algorithm;

public class IsPalindrome {
	private int num;
	public IsPalindrome(int num) {
		this.num=num;
	}
	public boolean solution() {
		Integer obj = new Integer(this.num);
		java.lang.String str = obj.toString();
		char[] charArr = str.toCharArray();
		int half = (int) Math.floor(charArr.length / 2);
		for (int i = 0; i < half; i++) {
			if (!(charArr[i] == charArr[charArr.length - 1 - i]))
				return false;
		}
		return true;
	}

	public static void main(String[] args) {
		IsPalindrome obj=new IsPalindrome(141);
		boolean result=obj.solution();
		System.out.println(result);
	}
}

代码讲解

我们这里讲解一些类方法和代码细节。首先我们看到我们在IsPalindrome类中写了一个构造器,给类属性num赋值。这个其实就是个人习惯,如果大家偏向于把num当作solution方法的一个参数也没有问题,或者更甚者直接把solution写成一个静态方法,不用实例化这一步。

另外,Integer类可以看作是基本类型int的面对对象版,是一个包装类。因为有了类,所以就能有很多便利的方法,比如toString(int num),他可以把整型num转换成字符串。另外的方法后面会讲。R.toCharArray()可以把字符串R转换成一个字符数组,比如:“java"就会被转换成{'j', 'a', 'v', 'a'},这样方便后续的遍历操作。

floor(float dec)方法来自于静态库Math,他的作用是砍掉一个小数的小数部分并替换为0。比如Math.floor(5.6)结果是5.0。为什么要这一步呢?在实现思路模块中我们看到了一个例子1991(为了区分我们使用不同颜色)。对其数组化我们得到{'1', '9', '9', '1'}。我们可以这么比较:1<->1, 9<->9, 9<->9, 1<->1。不过大家可能发现了,这样比较似乎重复了两次。我们可以去掉后面两次比较,因为如果a=b,则一定有b=a;若a!=b,则b!=a一定成立。这么看来,比较次数为数组长度的一半就足够了。但是考虑到数组长度为奇数的情况,比较次数=(int)Math.floor(数组长度/2)最为稳妥。


反转数字

实现思路

反转数字这里提供两种思路,第一种是直接通过数字运算的形式反转数字;第二种是利用了字符串的性质,先把整数转换成字符串,正向取出单字符串,反向拼接得到反转字符串,再转换回整数。这两种方法我们都会举例子进行理解。假设我们要反转的数字num为-1324。

用第一种方法的话,首先num要经过一处while循环。R用来存储反转后的结果,先初始化为0。第一次循环R=R*10+num%10,就是R=0*10+(-1324)%10,结果是R=4,然后让num=num//10,那num此时等于-132。第二次循环,同理,R=R*10+num%10,就是4*10+(-132)%10,得到42,同时num=num//10,即num=-132//10,结果是-13。反复这么几次,我们就可以成功的得到:-4231。原理就是:我们通过取余和取整把数字的每一位都取出来,从个位到最高位,反转数字中每新增一个位数,之前的结果就乘10,并让目标数字整除10,这样最高位永远在反转数字中处于最后一位。

用第二种方法,我们在把num转换成字符串并创建存储反转后结果的空字符串R后,通过for循环遍历字符串,把每一个单字符取出来,拼接到R。我们举个例子,要处理字符串1324。循环第一次取出1,R='1'+R->R='1'。第二次取出3,R='3'+R->R='3'+'1'->R='31'。第三次:R='2'+'31'->R='231';第四次:R='4'+'231'->R='4231'。最后再把它转换成int类型,同样也实现了了反转的效果。这个方法有一个小问题,就是他不方便处理负数,虽然不是不行,但是需要费一番周折,大家可以自行尝试,这里(包括代码)就不再演示了。

其实还有几种不错的实现反转数字的思路,多半凭借字符串性质实现,大家可以自行尝试,这里就不说明了。


代码展示

package advance.algorithm;

public class ReverseNum {
	public static int solution1(int num) {
		int R=0;
		while(num!=0) {
			R=R*10+num%10;
			num/=10;
		}return R;
	}
	
	public static int solution2(int num) {//无法接收负数
		String s=Integer.toString(num);
		String R="";
		for(char e:s.toCharArray())
			R=e+R;
		return Integer.valueOf(R);
	}
	
	
	public static void main(String[] args) {
		int num=-1324;
		System.out.println(solution1(num));
	}
}

代码讲解

代码块中或许有些需要介绍的方法和写法。num/=10其实就是num=num//10的简写版。valueOf(String str)方法,同样身为Integer类中的一个方法,与toString()的功能相反,他会把字符串转换成int类型的数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值