A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

// 判断字符串是否是回文,这个有可能是面试题目
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("不是回文");
                                }
        }
}

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 好问题,我又学到了一个算法

查看全部评分

10 个回复

倒序浏览
我工作的地方隔壁就是一家软件企业,面试的就是这个,这个代码是别人写的,我没弄明白求高手指点
回复 使用道具 举报
本帖最后由 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]   那么就可以判断 你输入的字符串是一个回文的  否则不是回文!!

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 希望多到云7活跃,云7需要你

查看全部评分

回复 使用道具 举报
Faner 发表于 2013-11-17 22:21
int i;// 这里为什么要定义两个变量?它们是用来做什么的  记录回文的第一位   int j; 记录回文的最后一位  ...

  其实 arr!= arr[j]  是这个  arr!= arr[j])    一直无法显示  无法编辑 所以 请您不要误解  
回复 使用道具 举报
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("不是回文");
                                }
        }
看了你的代码 ,大概明白了,题目的意思是检测你输入的是不是回文输入

我给你这样解释吧,就是你输入的字符从前向后读或者倒着读是一样的,所以方法就是看看第一个字符和最后一个字符是不是一样的,如果一样的就表示回文了,下来在检测第二个和倒数第二个是否是一样的,以此类推直到一半的时候就不用检测了,

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 赵晓海 于 2013-11-17 23:01 编辑

回文的概念是:一串字符串从前往后读和从后往前读都是一样的,比如:”123aba321“,”123abba321“ 都是回文。
  1. int j;
  2.                 int i;// 这里为什么要定义两个变量?它们是用来做什么的
  3.                 char[] arr=str.toCharArray();//并且在这里定义一个字符型的数组,将字符串转换成数组toCharArray这里的C要大写

  4.                 for (i =0,j=arr.length-1; i<j; i++,j--)//这个条件语句为什么要这样写?
  5.                 {
  6.                         if(arr[i] != arr[j]){//这是判断什么的?
  7.                                 break;
  8.                                 }}//?
  9.                 }
  10.                         if(i>=j)//这里又是判断什么的?
  11.                                 {
  12.                                         System.out.println("是回文");
  13.                                 }else
  14.                                 {
  15.                                         System.out.println("不是回文");
  16.                                 }
  17.         }
复制代码
这段代码的思路是这样的:
如果是回文,那么它一定是对称的,比如"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",数一下立刻就清楚了。

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 晓海同学,好样的,就需要这样回答问题.

查看全部评分

回复 使用道具 举报
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("不是回文");
                                 }
         }
}
楼上已经解释很好了

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 感谢回答,虽然只是复制一下。.

查看全部评分

回复 使用道具 举报
记得我当时用C实现的时候搞了半天,用java却如此简单

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 所以java才这么火,加油哈

查看全部评分

回复 使用道具 举报
狼王 高级黑马 2013-11-18 09:20:40
9#
以前我都没有可以去看过这个问题,今天我又学到了一个知识点
回复 使用道具 举报
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 18:02:13 CST 2014
回复 使用道具 举报
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 20:37:02 CST 2014
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马