Raptor-回文字符串判断
1. 题目描述
输入一个字符串,判断其是否是回文。回文是正向拼写与反向拼写都一样的字符串。例如:"abcba"和"abccba"都是回文。
2. 算法分析
我们在Raptor中输入字符串,记为 s,在Raptor中,字符串 s 是以字符数组的形式存在,我们可以利用数组对回文字符串进行判断。
比如字符数组 s = "abcdeedcba",这个数组的长度也即末端索引位置可以用自带函数 length_of 来获取。我们定义两个循环变量 i 和 j,其中 i 记录起始索引的位置,初始值 i=1;j 记录末端索引的位置,初始值 j=length_of(s)。利用循环,从两头向中间逼近,依次判断 s[i] 和 s[j] 是否相等。如果一直到 i>=j 时, s[i] 和 s[j] 仍然相等,说明这个字符串就是回文字符串;如果中间某一步 s[i]=s[j] 不成立,那么退出循环,最后 i 必然小于 j。
这样,循环结束的条件可以设为满足 i>=j or s[i] != s[j],其中 i>=j 是回文结束的条件,s[i]!=s[j]是非回文结束的条件。(这里的 != 表示不等于)
举两个例子:
2.1 回文字符串例子s = "abcdeedcba"
初始值 i=1, j=length_of(s)=10
- s[i]= 'a', s[j]='a', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=2, j=9);
- s[i]= 'b', s[j]='b', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=3, j=8);
- s[i]= 'c', s[j]='c', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=4, j=7);
- s[i]= 'd', s[j]='d', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=5, j=6);
- s[i]= 'e', s[j]='e', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=6, j=5);
- s[i]='e', s[j]='e',满足 i>=j or s[i] != s[j],循环结束。
此时 i>=j,字符串 s 是回文字符串。
2.2 非回文字符串例子 s="abceba"
初始值 i=1, j=length_of(s)=6
- s[i]= 'a', s[j]='a', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=2, j=5);
- s[i]= 'b', s[j]='b', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=3, j=4);
- s[i]= 'c', s[j]='e', 满足 i>=j or s[i] != s[j],循环结束。
流程结束,此时不满足 i>=j,字符串 s 不是回文字符串。
3. 流程图
4.测试结果
4.1 回文字符串例子s = "abcdeedcba"
4.2 非回文字符串例子 s="abceba"
5. 特殊说明 (回文数字判断)
本题中的程序仅用于判断字符串是否回文,无法判断数字是否回文,为什么呢?因为Raptor对于输入框中的内容,如果仅为数字,不包含除了数字之外的其它字符,则当做数字处理。这时,如果我们直接用本程序,就会出现如下错误 "s is not a 1D array",这时s仅为一个数字,不是一维数组,无法进行数组索引操作。
如果输出框中包含除数字之外的其它字符,那么这个输入就会被当做一个字符串,这样,我们可以借助特殊字符包裹数字,进行回文数的判断。例如我们在数字两边加上 "#",输入变成 #123321#,就可以利用回文字符串的程序来判断数字是否为回文数了,如下:
当然,这里的特殊符号可以任意取,只要包裹在输入数字两边的一样就可以了。回文数判断相当于拓展自回文字符串判断,需要在输入数字的两边加上特殊符号,以形成字符串。下一篇博客我们将聚焦回文数判断,发展针对数字的回文数判断程序。
2401_84586811: item一直在变
桦林子: double类型经常会出现精度问题,我自己跑代码发现使用“1.0/i<=n”和“1.0/i>n”分别作为判断的条件,发现得到的结果不同,可能是double类型进行比较不安全吧,以后碰到这种情况两种判断条件都试试咯
栀蓝607: 为什么不能用for循环呢
721月127: 为啥i是2
2301_81905779: 如何求两个数之间的素数和呢