LeetCode: Palindrome number


问题描述:

1)到底怎样的整数才算是回文,或者说回文有什么特点?

答:整数必须是镜像即关于中间位对称,称该整数为回文。

2)负数到底算不算回文?

答:不算。


算法思路:

1)统计整数的位数,记为count;

2)根据count进行溢出判断,若溢出则return false;

3)判断该给定的整数是否为回文;


按照算法思路,我将它总结以下2方面进行介绍。一)如何统计整数的位数;二)如何去判断该给定的整数是否为回文。

一、如何统计整数的位数

        这个比较简单,但是我还是单独写一块,方便以后查看。方法就是初始化count=1,然后将整数num除以10取整,判断是否(>=1),满足则count++, 且不断更新num的值。
        片段代码:
	for (count=1; (num=num/Pow(10,1))>=1;)
	{
		count++;
	}

二、判断该给定的整数是否为回文

        这块是整个代码的核心。由于不太好单独说明,所以详见代码注释。
	for (i=1,j=count; i<j; i++,j--)
	{

		L_val=Pow(10,count-i);//提取当前位的被除数
		_left=num/L_val;
		left_compare=_left-L_buf*10;//<span style="font-family: Arial, Helvetica, sans-serif;">提取比较位</span>
		L_buf=_left;//存值,为了提取比较位

		R_val=Pow(10,count-j+1);
		_right=num%R_val;
		right_compare=_right/(Pow(10,count-j));

		if (left_compare!=right_compare)
		{
			return false;
		}
		
	}

三、整个问题的源码

#define P_a 2147483647//consider int overflow
#define N_a -2147483648

int Pow(int x, int y)
{

	int sum=1;
	int i;

	for (i=1; i<=y; i++)
	{
		sum=sum*x;
	}
	return sum;
}

bool isPalindrome(int x) {

	int num=x;
	int negtive_val;
	int count;
	int dis;
	int flag=1;
	int i,j;
	int _left,_right;
	int left_compare,right_compare;
	int L_val,R_val;
	int L_buf=0,R_buf=0;

	//consider x is negtive
	if (num==0)
	{
		return true;
	}
	if (num<0)
	{
	    flag=-1;
	    negtive_val=num;
		num=-num;
		
		return false;
	}

	//count bit numbers
	for (count=1; (num=num/Pow(10,1))>=1;)
	{
		count++;
	}
//	printf("count is %d\n",count);

	//consider overflow
	if (count>10)
	{
		printf("overflow\n");
		return false;
	}
	else if (count==10)
	{

		if (num/Pow(10,count-1)>2)
		{
			printf("overflow\n");
			return false;
		}

	}
	
	if(flag<0)
	{
	    dis=negtive_val-N_a;
	    if(dis<=0)
	    {
	        printf("overflow\n");
			return false;
	    }
	}
	else if(flag>0)
	{
	    dis=num-P_a;
	    if(dis>=0)
	    {
	        printf("overflow\n");
			return false;
	    }
	}
	//over 

	num=x;

	for (i=1,j=count; i<j; i++,j--)
	{

		L_val=Pow(10,count-i);
		_left=num/L_val;
		left_compare=_left-L_buf*10;
		L_buf=_left;

		R_val=Pow(10,count-j+1);
		_right=num%R_val;
		right_compare=_right/(Pow(10,count-j));

		if (left_compare!=right_compare)
		{
			return false;
		}
		
	}

	return true;

}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值