黑马程序员技术交流社区
标题:
判断回到底是怎么一回事,求高手指点?
[打印本页]
作者:
vincentgood
时间:
2013-11-17 22:02
标题:
判断回到底是怎么一回事,求高手指点?
// 判断字符串是否是回文,这个有可能是面试题目
import java.util.*;
public class huiwe
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.println("请输入字符串:");
String str=input.next();
int j;
int i;// 这里为什么要定义两个变量?它们是用来做什么的
char[] arr=str.toCharArray();//并且在这里定义一个字符型的数组,将字符串转换成数组toCharArray这里的C要大写
for (i =0,j=arr.length-1; i<j; i++,j--)//这个条件语句为什么要这样写?
{
if(arr[i] != arr[j]){//这是判断什么的?
break;
}}//?
}
if(i>=j)//这里又是判断什么的?
{
System.out.println("是回文");
}else
{
System.out.println("不是回文");
}
}
}
作者:
vincentgood
时间:
2013-11-17 22:11
我工作的地方隔壁就是一家软件企业,面试的就是这个,这个代码是别人写的,我没弄明白求高手指点
作者:
Faner
时间:
2013-11-17 22:21
本帖最后由 Faner 于 2013-11-17 22:28 编辑
int i;// 这里为什么要定义两个变量?它们是用来做什么的 记录回文的第一位 int j; 记录回文的最后一位 这里讲的i 和 j 都是数组的下标‘
for (i =0,j=arr.length-1; i<j; i++,j--)//这个条件语句为什么要这样写? 这句是判断 循环的条件
if(arr
!= arr[j]){//这是判断什么的? 这句判断 第一个字和最后一个字是否一样 如果不一样 就可以判断 你输入的不是回文字符串 直接退出程序即可
if(i>=j)//这里又是判断什么的? 这句类似指针的效果 例如 123321 i-0 是代表第一位数值 1 j=5 i不停的循环加一 j 不停的减一 y一直到 i 的取值大于 j 了 还么有出现arr
!= arr[j] 那么就可以判断 你输入的字符串是一个回文的 否则不是回文!!
作者:
Faner
时间:
2013-11-17 22:30
Faner 发表于 2013-11-17 22:21
int i;// 这里为什么要定义两个变量?它们是用来做什么的 记录回文的第一位 int j; 记录回文的最后一位 ...
其实 arr!= arr[j] 是这个 arr
!= arr[j]) 一直无法显示 无法编辑 所以 请您不要误解
作者:
雪龙
时间:
2013-11-17 22:34
for (i =0,j=arr.length-1; i<j; i++,j--)//这个条件语句为什么要这样写?
这里定义两个变量就是用来记录第一个和最后一个,或者第二个和倒数第二个这样的成对的字符的。
{
if(arr
!=
arr[j]){//这是判断什么的?
这里你写错了吧是arr
也就是从前数和从后数个数一样地方上的字符不相等就跳出循环,不在进行下面的输出了
break;
}}//?
}
if(i>=j)//这里又是判断什么的?
这里是来检测是否判断了一半,为了提高效率,判断一半就够了,下面的意思是判断完了都不一样就说明不是回文,如果一样就是回文
{
System.out.println("是回文");
}else
你的这个输出写反了吧,检测到一半即使两个字符一样也不是回文啊,并且一半之前都没有相等一半之后怎么会相等 ,还有在for的判断语句中是i<j;所以你下面的几乎没有必要啊。
System.out.println("不是回文");
}
}
看了你的代码 ,大概明白了,题目的意思是检测你输入的是不是回文输入
我给你这样解释吧,就是你输入的字符从前向后读或者倒着读是一样的,所以方法就是看看第一个字符和最后一个字符是不是一样的,如果一样的就表示回文了,下来在检测第二个和倒数第二个是否是一样的,以此类推直到一半的时候就不用检测了,
作者:
赵晓海
时间:
2013-11-17 22:55
本帖最后由 赵晓海 于 2013-11-17 23:01 编辑
回文的概念是:一串字符串从前往后读和从后往前读都是一样的,比如:”123aba321“,”123abba321“ 都是回文。
int j;
int i;// 这里为什么要定义两个变量?它们是用来做什么的
char[] arr=str.toCharArray();//并且在这里定义一个字符型的数组,将字符串转换成数组toCharArray这里的C要大写
for (i =0,j=arr.length-1; i<j; i++,j--)//这个条件语句为什么要这样写?
{
if(arr[i] != arr[j]){//这是判断什么的?
break;
}}//?
}
if(i>=j)//这里又是判断什么的?
{
System.out.println("是回文");
}else
{
System.out.println("不是回文");
}
}
复制代码
这段代码的思路是这样的:
如果是回文,那么它一定是对称的,比如"123aba321"和“123abba321“。如果是你来判断这两个是不是回文的话,你肯定是先看这两个字符串的第一个和最后一个是不是一样,然后看第二个和倒数第二个是不是一样,依次类推,直到判断至中间。
如果用代码实现的话,那么就需要两个变量,一个从头至尾取,另一个倒着取。这两个变量就分别对应着"arr[ i ]"和"arr[j]";
i=0,j=arr.length-1; i<j; i++,j-- 这句里面"i"是从头开始计数,"j"是从尾开始计数,当然是i++,j--。你自己去数一数回文,判断到最后,第一个i=j,第二个i<j;
"arr[ i ] != arr[j]"这里是说如果取出的两个字符不相等,那么就可以判断不是回文了。不是回文的例子也好举"123adb321",数一下立刻就清楚了。
作者:
菜不鸟
时间:
2013-11-17 23:57
import java.util.*;
public class huiwe
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.println("请输入字符串:");
String str=input.next();
int j;
int i;// 用来做数组下标
char[] arr=str.toCharArray();//toCharArray这里的C要大写因为java方法的命名方式,再说toCharArray()应该是char里面的方法。
for (i =0,j=arr.length-1; i<j; i++,j--)//因为回文数是对称的,比如12321?所以要这样写即a[i]=1 a[j]=1; a[i+1]=a[j-1]=2.。。。
{
if(arr[i] != arr[j]){//判断a[i]=a[j-1]=1,a[i+1]=a[j-1]=2.。。。
break;
}}//?
}
if(i>=j)
{
System.out.println("是回文");
}else
{
System.out.println("不是回文");
}
}
}
楼上已经解释很好了
作者:
终结者
时间:
2013-11-18 00:05
记得我当时用C实现的时候搞了半天,用java却如此简单
作者:
狼王
时间:
2013-11-18 09:20
以前我都没有可以去看过这个问题,今天我又学到了一个知识点
作者:
Linuxgg
时间:
2014-2-23 18:02
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 18:02:13 CST 2014
作者:
Linuxgg
时间:
2014-2-23 20:37
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 20:37:02 CST 2014
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2