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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我刚开始做时,用了个特笨特笨的方法!
大家也做一下,不查百度看做出来的代码是否是最优的!
这是我的笨方法,代码如下:
  1. /*
  2.         题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
  3.         都是多少?
  4. */

  5. class Test_2
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 medth();
  10.         }

  11.         //********笨方法***********
  12.         public static void medth()
  13.         {
  14.                 int j = 1;
  15.                 int a = 0;
  16.                 int b = 0;
  17.                 int c = 0;
  18.                 for(int i=100;i<=999;i++)        //通过遍历把100到999的个、十、百位都分开
  19.                 {
  20.                         boolean bon1 = false;                //初始化标记
  21.                         boolean bon2 = false;                //初始化标记
  22.                         boolean bon3 = false;                //初始化标记

  23.                         a = i/100;                                //百位数字
  24.                         b = i/10%10;                        //十位数字
  25.                         c = i%10;                                //个位数字

  26.                         if(a!=b && a!=c && b!=c) //判断得到个、十、百位互不相同的数字
  27.                         {
  28.                                 bon1 = Demo(a);                //传入a值看是否存在
  29.                                 bon2 = Demo(b);                //传入b值看是否存在
  30.                                 bon3 = Demo(c);                //传入c值看是否存在
  31.                         }
  32.                         if(true==bon1 && true==bon2 && true==bon3)        //如果bon1、bon2、bon3都为true时才符合条件
  33.                         {
  34.                                 System.out.println((j++)+"\ti="+i);
  35.                         }
  36.                 }
  37.         }

  38.         public static boolean Demo(int n) //分别查找a、b、c是否在
  39.         {
  40.                 boolean bon = false;
  41.                 for(int i=1;i<=4;i++)
  42.                 {
  43.                         if(n==i)
  44.                                 bon = true;                //如果传入数值包含1~4中,则返回true
  45.                 }
  46.                 return bon;
  47.         }
  48. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

17 个回复

倒序浏览
1^2^3^4 用异或 相同为0不同为1
回复 使用道具 举报
没人  顶起呢{:soso_e144:}
回复 使用道具 举报
没人  顶起呢{:soso_e144:}
回复 使用道具 举报
我感觉还是老实儿的用for嵌套挺好的·!  {:soso_e127:}
public class demo
{
    public static void main(String[] args)
    {
        int n = 0;
        for(int a = 1; a <= 4; ++a)
        {
            for(int b = 1; b <= 4; ++b)
            {
                for(int c = 1; c <= 4; ++c)
                {
                    if(a != b && b != c && a != c && ++n != 0)
                     System.out.println("NO."+n+":"+a+""+b+""+c);
                }
            }
         }               
        System.out.println("共有:" + n + "种");
    }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 鼓励新人的回答精神

查看全部评分

回复 使用道具 举报
金政极 发表于 2012-9-23 13:47
我感觉还是老实儿的用for嵌套挺好的·!  
public class demo
{

:L你还是百度了!!!:L

但是这个不算是最优的 做法,我认为应该改动一下就OK了?
我这个代码如果是1、3、5、7呢?
回复 使用道具 举报
黑马杨晨 发表于 2012-9-23 13:52
你还是百度了!!!

但是这个不算是最优的 做法,我认为应该改动一下就OK了?

不百度FOR循也是最简单追直接的思路啊
回复 使用道具 举报
金政极 发表于 2012-9-23 13:54
不百度FOR循也是最简单追直接的思路啊

哪1、3、5、7你该怎么解决!!!!!???????????????
回复 使用道具 举报
黑马杨晨 发表于 2012-9-23 13:58
哪1、3、5、7你该怎么解决!!!!!???????????????

这个简单啊把条件改一下就好了,



public class demo
{
    public static void main(String[] args)
    {
        int n = 0;
        for(int a = 1; a <= 8; a+=2)
        {
            for(int b = 1; b <= 8; b+=2)
            {
                for(int c = 1; c <= 8; c+=2)
                {
                    if(a != b && b != c && a != c && ++n != 0)
                     System.out.println("NO."+n+":"+a+""+b+""+c);
                }
            }
         }               
        System.out.println("共有:" + n + "种");
    }
}
回复 使用道具 举报
金政极 发表于 2012-9-23 14:38
这个简单啊把条件改一下就好了,

呵呵  不得 不说你太有才了,哪如果没规律呢?
比如,1、3、4、9呢?
回复 使用道具 举报
黑马杨晨 发表于 2012-9-23 14:41
呵呵  不得 不说你太有才了,哪如果没规律呢?
比如,1、3、4、9呢?

:'(   题本来就是在有规律的情况下寻找最为简单的方法么·····,你这么问就又是另一个题了好吧·····首先你出题的题就是在有一定的规律的情况下做出最优解,所以从这个角度来说你写的是本方法。
:L  没规律的话我就很赞同你的方法了~!非常实用
回复 使用道具 举报
金政极 发表于 2012-9-23 14:48
题本来就是在有规律的情况下寻找最为简单的方法么·····,你这么问就又是另一个题了好吧··· ...

很简单,通过数组把没有规律的数字,变成有规律的,我想你应该知道了???:lol
回复 使用道具 举报
金政极 发表于 2012-9-23 14:48
题本来就是在有规律的情况下寻找最为简单的方法么·····,你这么问就又是另一个题了好吧··· ...
  1. public static void Demo_1()
  2.         {
  3.                 int[] arr = {1,2,3,4};
  4.                 for(int a=0;a<arr.length;a++)
  5.                 {
  6.                         for(int b=0;b<arr.length;b++)
  7.                         {
  8.                                 for(int c=0;c<arr.length;c++)
  9.                                 {
  10.                                         if(arr[a]!=arr[b] && arr[a]!=arr[c] && arr[b]!=arr[c])
  11.                                         {
  12.                                                 System.out.println(arr[a]*100+arr[b]*10+arr[c]);
  13.                                         }
  14.                                 }
  15.                         }
  16.                 }
  17.         }
复制代码
回复 使用道具 举报
黑马杨晨 发表于 2012-9-23 14:58

······:L
回复 使用道具 举报
  1. /**
  2. * 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
  3. * 都是多少?
  4. */
  5. import java.util.HashSet;
  6. import java.util.Random;

  7. public class Test_2 {

  8.         /**
  9.          * 用来存放不同数字组合的容器
  10.          */
  11.         private static HashSet<String> nums = new HashSet<String>();

  12.         /**
  13.          * 一个临时容器,在isNoRepeat()方法中需要调用到,用来判断每次随机产生的三个数字是否有重复.
  14.          */
  15.         private static HashSet<Character> noRepeats = new HashSet<Character>();

  16.         public static void main(String[] args) {
  17.                 method(200);
  18.                 System.out.println("一共有" + nums.size() + "个不重复数字组成");
  19.                 System.out.println(nums);
  20.         }

  21.         /**
  22.          * 入口调用端
  23.          *
  24.          * @param cycleCount
  25.          *            用户想要随机产生三个数字的次数
  26.          */
  27.         public static void method(int cycleCount) {
  28.                 for (int i = 0; i < cycleCount; i++) {
  29.                         add();
  30.                 }
  31.         }

  32.         /**
  33.          * 只要每次产生互不相同且不重复的三个数字就存放进nums容器中
  34.          *
  35.          * @return 成功返回true
  36.          */
  37.         private static boolean add() {
  38.                 Random random = new Random();
  39.                 String s1 = String.valueOf(random.nextInt(4) + 1);
  40.                 String s2 = String.valueOf(random.nextInt(4) + 1);
  41.                 String s3 = String.valueOf(random.nextInt(4) + 1);
  42.                 String temp = s1 + s2 + s3;
  43.                 boolean noRepeat = isNoRepeat(temp);
  44.                 boolean add = false;
  45.                 if (noRepeat) {
  46.                         add = nums.add(temp);
  47.                 }
  48.                 return add;
  49.         }

  50.         /**
  51.          * 用来判断三个数字是否重复的核心代码
  52.          *
  53.          * @param str
  54.          *            要用来判断是否有重复字符的字符串
  55.          * @return 如果给定字符串有重复字符就返回false,否则返回true.
  56.          */
  57.         private static boolean isNoRepeat(String str) {
  58.                 char c = '\u0000';
  59.                 boolean flag = false;
  60.                 noRepeats.clear();
  61.                 for (int i = 0; i < str.length(); i++) {
  62.                         c = str.charAt(i);
  63.                         flag = noRepeats.add(c);
  64.                         if (!flag) {
  65.                                 break;
  66.                         }
  67.                 }
  68.                 return flag;
  69.         }

  70. }
复制代码
回复 使用道具 举报

-

本帖最后由 谭立文 于 2012-9-23 18:32 编辑

对于互不相同的数(0除外)其实就是一个全排列的过程,这是以前玩C得时候写的,今天改了一下,用的递归,像这种题目不可能依赖多重for循环来实现的。
package com.wenfengkeji.heima;
public class AllSort {
public static void perm(char[] a, int k, int n)
{
  if(k == n-1)
  {
   for(int i = 0; i < n -1 ; i++)
   {
    System.out.print(a + " ");
   }
   System.out.println();
  }
  else
  {
   for(int i = k; i < n; i++)
   {
    char temp;
    temp = a[k];
    a[k] = a;
    a = temp;
    perm(a,k+1,n);
    temp=a[k];
    a[k]=a;
    a=temp;
   }
  }
}
public static void main(String[] args) {
  char[] ch = {'1','2','3','4'};
  perm(ch,0,4);
}
}
回复 使用道具 举报
  1. package cn.itcast.day1;

  2. public class Practise {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.         int num = 0;
  9.         System.out.printf("四个数可以组成 %d个数\n",4*4*4);
  10.         

  11.               for(int i = 1;i <= 4;i++){
  12.                                 for(int j = 1;j <= 4;j++){
  13.                                         for(int k = 1;k <= 4;k++){
  14.                                           System.out.printf("%d%d%d\n",i,j,k);
  15.                                           num++;
  16.                                         }
  17.                                 }
  18.                                
  19.                                
  20.                         }  
  21.                
  22.         
  23.         System.out.printf("总共组成的数%d",num);
  24.         }

  25. }
复制代码
回复 使用道具 举报
兄弟这样怎么样!
  1. class LianXi
  2. {
  3. public static void main(String[] args)
  4. {
  5. shuZi(1,3,4,9);
  6. }

  7. public static void shuZi(int x,int y,int z,int i)
  8. {
  9. int g = 0;
  10. for (int a=0; a<=9; a++)
  11. {
  12. if (a==x | a==y | a==z | a==i)
  13. {
  14. for (int b=0; b<=9; b++)
  15. {
  16. if (b==x | b==y | b==z | b==i)
  17. {
  18. for (int c=0; c<=9; c++)
  19. {
  20. if (c==x | c==y | c==z | c==i)
  21. {
  22. if (a!=b && b!=c && a!=c)
  23. {
  24. g++;
  25. int shu = a*100+b*10+c;
  26. System.out.println("第"+g+"组数字为:"+shu);
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }
  33. }
  34. System.out.println("一共有"+g+"组不同的数");
  35. }
  36. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马