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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


/*

需求:求1、2、3、4能组多少个无重复数字的三位数。

完全不知道步骤错在哪啊。求告知!
*/

import java.util.Scanner;

class NumberCouple2{

        public static void main(String[] args){

                int[] arr1 = new int[4];
                int[] arr2 = new int[4];
                int[] arr3 = new int[4];

                Scanner sc = new Scanner(System.in);

                System.out.println("请陆续输入四个数字:");

                for(int x=0; x<4; x++){

                        arr1[x] = arr2[x] =arr3[x] = sc.nextInt();
                }

                //调用方法输出部分。
                logicJisuan(arr1, arr2, arr3);

        }


                //逻辑计算部分。for嵌套语句计算方法。
                public static void logicJisuan(int[] arr1, int[] arr2, int[] arr3){

                        for(int x=0; x<arr1.length; x++){

                                System.out.println(arr1[x]);

                                for(int y=0; x<arr2.length; x++){

                                        if(arr2[y] != arr1[x]){

                                                System.out.println(arr2[y]);
                                        }

                                        for(int z=0; x<arr3.length; x++){

                                                if(arr3[z] != arr1[x] & arr3[z] != arr2[y]){

                                                        System.out.println(arr3[z]);
                                                }
                                        }
                                }
                        }
                }

}

14 个回复

倒序浏览
哦哈哟 来自手机 中级黑马 2016-3-26 07:45:15
沙发
logicjisuan方法里面的第二第三的for循环里的条件跟自增错了。还有你现在的思路也错了,循环套循环套循环。他是把最里面的先循环完再执行外面的一层,最后再到最外层循环。所以,开始你就没有做到百位十位不相同了。
回复 使用道具 举报
请问  Scanner
这个类是哪个版本的啊,我的API6.0的怎么没有啊
回复 使用道具 举报
将第二个for循环的右大括号拿下来没嵌套
回复 使用道具 举报
        public static void logicJisuan(int[] arr1, int[] arr2, int[] arr3)
        {
                for(int x=0; x<arr1.length; x++)
                {
                        for(int y=0; y<arr2.length; y++)
                        {
                                if(arr2[y] != arr1[x])
                                {
                                        for(int z=0; z<arr3.length; z++)
                                        {
                                                if(arr3[z] != arr1[x] & arr3[z] != arr2[y])
                                                {
                                                        System.out.println(arr1[x]+","+arr2[y]+","+arr3[z]);                                                                                                                               
                                                }

                                        }
                                 }
                        }
                 }

        }
回复 使用道具 举报
本帖最后由 luomoss 于 2016-3-26 11:41 编辑
luomoss 发表于 2016-3-26 11:31
public static void logicJisuan(int[] arr1, int[] arr2, int[] arr3)
        {
                for(int x=0; x

进过修改你再试试,首先你的循环中,y跟z为控制循环变量的for()里面,你还是x<length,x++这显然会让代码死循环。第二,你代码里面第一个打印的是arr1[0],换行了,换行了你就什么都看不出来是不是?第三就是,思路没有理清,第三个循环要嵌套到第二个循环的if里面去的,就是说第二个数如果不等于第一个数,第三个数才比较
或者第二个循环里面的if不需要,直接三个循环嵌套,在第三个循环里面,打印语句的条件是if(arr3[z] != arr1[x] & arr3[z] != arr2[y]&arr1[x]!=arr2[y])也可以的
回复 使用道具 举报
dxw 中级黑马 2016-3-26 13:35:18
7#
需求是问你有几个,是否应该加入一个“计数器”统计出个数,然后打印出来呢?
回复 使用道具 举报
本帖最后由 ameanboy 于 2016-3-26 17:55 编辑

感觉楼上的思路还是在用数学的办法去解。这个题应该考的是对树形结构递归穷举的理解,题目里给的数字,当然可以用1-444逐个转换字符串,再用正则表达式判断来解。但个人认为用递归的方式来做,普适应更好一些,数字换成对象也完全可以适用,大概思路是这样,假设1为根节点,那么树的结构:
  1. *                                                1
  2.                         /                        |                         \
  3.                         2                         3                        4
  4.                  /        |        \        /        |        \        /        |        \
  5. *                1        3        4        1        2        4        1        2        3
复制代码
2,3,4作为根节点也是这个结构
第一种方法代码:
  1. // 第一种穷举法
  2.     public static void demo1() {
  3.         int count = 0;
  4.         for (int i = 1; i <= 444; i++) {
  5.             String temp = i + "";
  6.             if (temp.matches("(?![1234]*([1234])[1234]*\\1[1234]*)[1234]{3}")) {
  7.                 System.out.print(i + "\t");
  8.                 count++;
  9.                 if(count%10==0){
  10.                     System.out.println();
  11.                 }
  12.             }
  13.             
  14.         }
  15.         System.out.println();
  16.         System.out.println("共有" + count + "种不重复组合");
  17.     }
复制代码




回复 使用道具 举报
dxw 中级黑马 2016-3-26 17:50:54
9#
ameanboy 发表于 2016-3-26 17:31
感觉楼上的思路还是在用数学的办法去解。这个题应该考的是对树形结构递归穷举的理解,题目里给的数字,当然 ...

同学666~
回复 使用道具 举报
哦哈哟 发表于 2016-3-26 07:45
logicjisuan方法里面的第二第三的for循环里的条件跟自增错了。还有你现在的思路也错了,循环套循环套循环。 ...

呃。。。原来如此
回复 使用道具 举报
LLQALLQ 发表于 2016-3-26 10:47
请问  Scanner
这个类是哪个版本的啊,我的API6.0的怎么没有啊

jdk1.7.0的
回复 使用道具 举报
as9600 发表于 2016-3-26 11:04
将第二个for循环的右大括号拿下来没嵌套

纳尼?
回复 使用道具 举报
luomoss 发表于 2016-3-26 11:37
进过修改你再试试,首先你的循环中,y跟z为控制循环变量的for()里面,你还是x ...

多谢大神!
回复 使用道具 举报
ameanboy 发表于 2016-3-26 17:31
感觉楼上的思路还是在用数学的办法去解。这个题应该考的是对树形结构递归穷举的理解,题目里给的数字,当然 ...

多谢大神!
回复 使用道具 举报
dxw 发表于 2016-3-26 13:35
需求是问你有几个,是否应该加入一个“计数器”统计出个数,然后打印出来呢? ...

呃。。。。。。。居然没想到这个。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马