黑马程序员技术交流社区

标题: 有个不懂的代码块,求大神帮忙 [打印本页]

作者: 插兜    时间: 2015-9-14 17:12
标题: 有个不懂的代码块,求大神帮忙
今天早上看了个帖子,楼主写了块代码,有一块一直没看懂,就大神帮解释下。
原代码如下:
/**
* 第七题: 编写程序,打印1到100之内的整数,但数字中包含7的要跳过,例如:17、27、71、72
* @author Machel
*/
class Test7{
        public static void main(String[] args){
                char log = '7';
                char[] intArr;
                int num = 0;
                for(int i=1; i<=100; i++)
                {
                        intArr = Integer.toString(i*100).toCharArray();
                        for(int j=0; j<3; j++)
                        {
                                if(intArr[j]==log)
                                        num++;
                        }
                        if(num==0)
                        {
                                if(i==100)
                                        System.out.print("["+i+"]");
                                else
                                        System.out.print("["+i+"]"+",");
                        }
                        else
                                num = 0;
                }
        }
}
到这结束了。不懂的地方如下:
为什么i*100,j又代表什么。
intArr = Integer.toString(i*100).toCharArray();
                        for(int j=0; j<3; j++)//这个for循环是为了什么呢
                        {
                                if(intArr[j]==log)
                                        num++;
                        }
作者: kenfans    时间: 2015-9-14 18:11
这代码写得真……

包含7的跳过就对10取余不就完了,还搞个循环for嵌套for,if嵌套if,toString又tocharArray连个注释都没有

一个循环就可以搞定的代码,硬是写得复杂得要死
作者: heshiwei    时间: 2015-9-14 18:24
首先建议楼主,代码还需要简练。
Integer.toString(i*100) 是因为后面的 j 固定3,如果当i=1~9时,位数不足3位,那么循环for (int j = 0; j<3;j++)
必然报错。

如果要仅仅实现去掉包含7的数字,建议使用如下代码:
for (int i = 1; i <= 100; i++){
  int res = Integer.toString(i).indexOf('7'); // 是否包含7
  if (res != 0){
    // 包含
  } else {
   // 不包含
  }
}
作者: Mr.W    时间: 2015-9-14 21:01
kenfans 发表于 2015-9-14 18:11
这代码写得真……

包含7的跳过就对10取余不就完了,还搞个循环for嵌套for,if嵌套if,toString又tocharArr ...

完美的装了个13
作者: Tangjw    时间: 2015-9-14 21:06
楼主加油,再好好研究研究
作者: Mr.W    时间: 2015-9-14 21:10
heshiwei 发表于 2015-9-14 18:24
首先建议楼主,代码还需要简练。
Integer.toString(i*100) 是因为后面的 j 固定3,如果当i=1~9时,位数不 ...

indexOf('7'),这只表示第一个7吧,还有77的呢
作者: Mr.W    时间: 2015-9-14 21:11
heshiwei 发表于 2015-9-14 18:24
首先建议楼主,代码还需要简练。
Integer.toString(i*100) 是因为后面的 j 固定3,如果当i=1~9时,位数不 ...

你是对的,只要排除有7的就行了
作者: Wqi    时间: 2015-9-14 21:13
水的一手好帖
作者: 夏木南生    时间: 2015-9-14 22:32

水的一手好帖
作者: 天涯莫名    时间: 2015-9-14 22:42
路过,顶一下
作者: LYfeeling    时间: 2015-9-14 22:55
其实我只是路过的
作者: Hi不言而喻    时间: 2015-9-14 23:04
没看懂
作者: cloud1991    时间: 2015-9-15 10:01
楼主,1到100之间只要是十位与个位是7的你就跳过就可以了
作者: kenfans    时间: 2015-9-16 00:09
Mr.W 发表于 2015-9-14 21:01
完美的装了个13

不是装不装的问题,我是不认识这个写代码的,要是认识我就直接开骂了。代码本来就讲究个简洁。我写个你看。
int[] a = new int[100];
int pos = 0;
for(int x=0;x<=100;x++){
     if((x%10==7)||(x/10==7))
          continue;
    else{
    a[pos]=x;
     pos++;
     }
}
一个for一个if就搞定了,写得麻烦给谁看?
作者: fmi110    时间: 2015-9-16 09:21
  1. //利用字符串String中的contains()方法判断是否包含7
  2. public class Temp {
  3.         public static void main(String[] args) {
  4.                 String str = null;
  5.                 for(int i = 1;i <= 100;i++){
  6.                         str = String.valueOf(i);
  7.                         if(str.contains("7")) { //包含7的输出
  8.                                 System.out.println(str);
  9.                         }
  10.                 }
  11.         }
  12. }
复制代码

输出
  1. 7
  2. 17
  3. 27
  4. 37
  5. 47
  6. 57
  7. 67
  8. 70
  9. 71
  10. 72
  11. 73
  12. 74
  13. 75
  14. 76
  15. 77
  16. 78
  17. 79
  18. 87
  19. 97
复制代码

作者: Mr.W    时间: 2015-9-16 10:52
kenfans 发表于 2015-9-16 00:09
不是装不装的问题,我是不认识这个写代码的,要是认识我就直接开骂了。代码本来就讲究个简洁。我写个你看 ...

我写的时候思路和你是一样的,只能说更多的解题方法,发散了自己的思维吧,还是值得鼓励的
作者: 插兜    时间: 2015-9-16 12:57
Mr.W 发表于 2015-9-16 10:52
我写的时候思路和你是一样的,只能说更多的解题方法,发散了自己的思维吧,还是值得鼓励的 ...

为什么i*100,j又代表什么。for循环是为了什么,看不懂啊。
作者: 插兜    时间: 2015-9-16 12:58
Mr.W 发表于 2015-9-16 10:52
我写的时候思路和你是一样的,只能说更多的解题方法,发散了自己的思维吧,还是值得鼓励的 ...

我是想知道原因,多学点思路。
作者: Mr.W    时间: 2015-9-16 17:22
插兜 发表于 2015-9-16 12:57
为什么i*100,j又代表什么。for循环是为了什么,看不懂啊。

i*100,我觉得他的意思是为了凑成一个长度为3(就是j循环)的数组,这就是Integer.toString(i*100).toCharArray();的意义。再比较数组里面有没有字符7.这个方法可以放弃了,回复里有很多很好的办法啊
作者: Mr.W    时间: 2015-9-16 17:24
fmi110 发表于 2015-9-16 09:21
输出

然后加个!,就不输出带7 的了{:2_35:}
作者: kenfans    时间: 2015-9-16 21:02
Mr.W 发表于 2015-9-16 10:52
我写的时候思路和你是一样的,只能说更多的解题方法,发散了自己的思维吧,还是值得鼓励的 ...

发散思维肯定值得鼓励啊,但是写代码的基本要求就是简洁效率高,可读性强。在这两个条件下,什么方法都是好方法,如果写得繁琐得上百行,鬼都看不懂的代码。这种代码我都是看得懒得看的。搞开发的也不会用这种代码
作者: fmi110    时间: 2015-9-16 22:33
Mr.W 发表于 2015-9-16 17:24
然后加个!,就不输出带7 的了

bingo~~~~
作者: xiaoya0o0o    时间: 2015-9-16 23:08
i*100 是为了凑数,为了下面for(int j=0; j<3; j++),刚开始1-9的时候,如果只有intArr = Integer.toString(i*).toCharArray();的时候走到
for(int j=0; j<3; j++){
                        if(intArr[j]==log)
                                num++;
                }
会抛出 java.lang.ArrayIndexOutOfBoundsException数组下标越界的异常
作者: Mr.W    时间: 2015-9-17 00:44
kenfans 发表于 2015-9-16 21:02
发散思维肯定值得鼓励啊,但是写代码的基本要求就是简洁效率高,可读性强。在这两个条件下,什么方法都是 ...

唉,我们知道,写的人不知道。这叫闲的
作者: 插兜    时间: 2015-9-17 11:44
xiaoya0o0o 发表于 2015-9-16 23:08
i*100 是为了凑数,为了下面for(int j=0; j

谢谢了,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2