每天一题,讲解面试中最常见或者最新的算法题。
回文字符串与回文数字
<一>回文字符串
(微策略.2013/10/21.北京)任意给定一个字符串,判断该字符串是否是回文字符串。默认空串(即“\0”)为最小回文串。
思路:首尾指针法——用两个指针分别指向串的首尾,同时向中间扫描,直到出现指针引解(即指针指向的值)不等或首尾指针相遇为止。
备注:首尾指针法在算法中是一个十分常见的处理手段,尤其是在线性表中。很多的算法解都可以用首尾指针解答,读者在平时做题过程中应该多多总结。首尾指针法是双 指针的一个特列。双指针法在算法中也处于十分重要的地位。
代码:
bool IsPalindromes (char *str)
{
if (str==NULL)
{
return false;//边界检测
}
else
{
int i=0;//首指针
int j=strlen(str)-1;//尾指针
while (i<j)
{
if (str[i]!=str[j])
{
return false;
}
i++;//后移一位
j--;//前移一位
}
return true;
}
}
<二>回文数字
(创新工场.2013/10.北京)给定任意一个整数,判断是否是回文数字,例如1991是回文,1992不是回文。
分析:首先明确一点,给定的数是一个int32的整数,有正负号之分。题目没有明确说明负数是否也有回文,例如-1991或-0。如果单从表现形式上看-1991和-0不能算作回文数字,但是这样就有一个矛盾,0是回文但是-0不是回文,而0和-0的二进制模式是一模一样的,实在是蛋疼。为了理解方便,也问了展示算法的核心,这里我们就不纠结正负数了,仅仅考虑这个整数是自然数的情况。
代码:
bool IsPalindromes (int num)
{
if (num<0)//忽略负数情况
{
return false;
}
else
{
int tmp_result=0;
int tmp_num=num;
while (num>0)
{
tmp_result=tmp_result*10+num%10;
num/=10;
}
return tmp_result==tmp_num;
}
}
评论:如果输入的数据是浮点数呢?应该怎么处理?