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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
求出1234四个数字的所有排序方式.要求13不能在一起,4不能作为开头.我的黑马面试题中笔试的一个题.老师说过这是一个很简单的逻辑思维题,但是就是没思路,最后用最笨的方法虽然写出来了,但觉得不应该是这样的.求大神给个简单明了的思路,并且代码实现....谢谢了
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 String[] s = { "1", "2", "3", "4" };
  4.                 for (int w = 0; w< s.length; w++) {
  5.                         for (int x = 0; x < s.length; x++) {
  6.                                 for (int y = 0; y < s.length; y++) {
  7.                                         for (int z = 0; z < s.length; z++) {
  8.                                                 if (w==x||w==y||w==z||x==y||x==z||y==z) {
  9.                                                         continue;
  10.                                                 } else {
  11.                                                         String ss = s[w] + s[x] + s[y] + s[z];
  12.                                                         if(!(ss.contains("13")||ss.contains("31")||ss.startsWith("4"))){
  13.                                                                 System.out.println(ss);
  14.                                                         }
  15.                                                 }

  16.                                         }
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21. }
复制代码


26 个回复

倒序浏览
  1. <blockquote>public static void main(String[] args) {
复制代码

我也遇到了同一个题目奥,但是我的做法跟你的不一样,你看看呗,要是觉得我这个简单点就给个分呗!嘻嘻
回复 使用道具 举报
  1. public static void main(String[] args) {
  2.                 for (int qian = 1; qian < 4; qian++) {
  3.                         for (int bai = 1; bai < 5; bai++) {
  4.                                 if((bai+qian) %2 == 0){
  5.                                         continue;
  6.                                 } else {
  7.                                         for (int shi = 1; shi < 5; shi++) {
  8.                                                 if(((shi+bai) %4 == 0)|(shi == qian)|(shi==bai)){
  9.                                                         continue;
  10.                                                 } else {
  11.                                                         for (int ge = 1;ge < 5; ge++) {
  12.                                                                 if(((ge+shi) %4 == 0)|(ge == shi)|(ge ==bai)|(ge == qian)){
  13.                                                                         continue;
  14.                                                                 }else {
  15.                                                                         int i = qian*1000+bai*100+shi*10+ge;
  16.                                                
  17.                                                                         System.out.println(i);
  18.                                                                 }
  19.                                        
  20.                                                         }
  21.                                        
  22.                                        
  23.                                                 }       
  24.                                         }
  25.                                
  26.                                 }
  27.                                
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码
回复 使用道具 举报
感觉用位置交换+递归代码会短点,具体的代码我还没写出来,网上有很多。
回复 使用道具 举报
赞一个!
回复 使用道具 举报

先看看大神们的回答吧,你的思路跟我的其实是一样,你只是把我else判断,13不在一起的加在判断语句中,我是先写出所以得数,去掉不符合条件的.
回复 使用道具 举报
scalar 发表于 2016-5-16 19:58
感觉用位置交换+递归代码会短点,具体的代码我还没写出来,网上有很多。

是的,听过这个思路但是代码实现没做出来,不妨写出来试试.学习的动力在于多动手
回复 使用道具 举报
罗勇 中级黑马 2016-5-20 01:19:58
8#
hailong154 发表于 2016-5-20 00:26
是的,听过这个思路但是代码实现没做出来,不妨写出来试试.学习的动力在于多动手 ...

难道是传说中的女神头像
回复 使用道具 举报
package com.heima.test;

import java.util.ArrayList;

public class Test_4 {
      public static void main(String[] args) {
      //创建集合,存储所有排列
        ArrayList<String> list = new ArrayList<>();
        int num = 0;
        for (int i = 1; i < 5; i++) {
               for (int j = 1; j < 5; j++) {
                    if (j != i) {
                for (int k = 1; k < 5; k++) {
                      if (k != i && k != j) {
                            for (int z = 1; z < 5; z++) {
                        if (z != i && z != j && z != k) {
                                  num = i * 1000 + j * 100 + k * 10 + z;                                                list.add(num+" ");
                        }
                           }
                      }
                        }
                  }
             }
        }
        System.out.println("1234四个数字的所有排序方式共有"+list.size()+"种,如下:");
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
                 //如果可能排列以4开头,则去除
                 if (list.get(i).startsWith("4")) {
              //i在这里需要--,以免有漏掉的
                      list.remove(i--);
        }else if(list.get(i).contains("13") || list.get(i).contains("31")) {
                //i在这里也需要--,以免有漏掉的
                   list.remove(i--);
        }
           }
        System.out.println("符合要求的有"+list.size()+"种,如下:");
        System.out.println(list);
        }
}
回复 使用道具 举报
18735346124 发表于 2016-5-23 16:54
package com.heima.test;

import java.util.ArrayList;

666666
回复 使用道具 举报
class Test2{
        public static void main(String[] args){
                for (int a=1 ; a<4 ; a++ ){
                        for (int b=1 ; b<=4 ; b++ ){
                                for (int c=1 ; c<=4 ; c++){
                                        for (int d=1 ; d<=4 ; d++ ){
if(a*b!=3 && b*c!=3 && c*d!=3 && a!=b && a!=c && a!=d  && b!=c && b!=d && c!=d){
                                                int s = a*1000 + b*100 + c*10 +d;
                                                        System.out.println(s);
                                                }
                                        }
                                }
                        }
                }
        }
}
回复 使用道具 举报
大笑哈哈 发表于 2016-5-26 21:44
class Test2{
        public static void main(String[] args){
                for (int a=1 ; a

兄弟 你这个好  牛x
回复 使用道具 举报
只想要5个黑马币没技术分怎么上就业班?
回复 使用道具 举报
lyoivneg 发表于 2016-5-27 15:15
兄弟 你这个好  牛x

这个就是为了回答,开发这么写会被打死吧
回复 使用道具 举报
本帖最后由 土菠萝 于 2016-5-28 11:13 编辑

/*
代码递归已画图解析了,有需要可以@我,或者加入QQ群 515848837 群里我会上传图片的
*/
public class Test {
   public static void main(String[] args) {
       String value = "1234";
       permutation(value.toCharArray(), 0);
   }
   public static void permutation(char[] str, int i) {
       if (i >= str.length)        //递归结束条件
           return;
       if (i == str.length - 1) {
               String result = String.valueOf(str);
               if(result.contains("13")||result.contains("31")||result.subSequence(0,1).equals("4")){
                       System.err.print("不满足条件的 :"+String.valueOf(str)+"\n");
               }else{
                       System.out.println("满足条件的:"+String.valueOf(str));
               }
       } else {
           for (int j = i; j < str.length; j++) {
               char temp = str[j];                //交换
               str[j] = str;
               str = temp;
               permutation(str, i + 1);//递归
               temp = str[j];
               str[j] = str;   //交换复原
               str = temp;
           }
       }
   }
}
回复 使用道具 举报
Linsa 中级黑马 2016-5-29 14:34:20
16#
还有其他的题吗?
回复 使用道具 举报
Linsa 中级黑马 2016-5-29 14:35:49
17#
[h1]还有其他的面试题吗?我下个月也就来见师姐了!!![/h1]
回复 使用道具 举报
不知道这样行不行
回复 使用道具 举报
不知道这样行不行public class test {
回复 使用道具 举报
public class test {
        public static void main(String[] args) {
                List<Integer> list = convertTolist();
                System.out.print(list.toString());
        }

        private static List<Integer> convertTolist() {
                List<Integer> list = new ArrayList<>();
                for(int i=1;i<=4;i++)
                {
                        for(int j=1;j<=4;j++)
                        {
                                for(int k=1;k<=4;k++)
                                {
                                        for(int m=1;m<=4;m++)
                                        {
                                                int num=i*1000+j*100+k*10+m;
                                                if(Integer.toString(num).startsWith("4")||
                                                                Integer.toString(num).contains("13")||
                                                                Integer.toString(num).contains("31"))
                                                {
                                                        continue;
                                                }
                                                else
                                                {
                                                        list.add(num);
                                                }
                                        }
                                }
                        }
                }
                        return list;
        }
       
}
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马