算法题——给定1234,求出串内不重复的三位数排列组合

386 阅读1分钟

面试题。不难,记录下来给找工作的小伙伴参考,或许能起些作用。

题目:给定1234四位数字,给出它的三位数无相同数字的不重复排列组合,实例:1234,123,234,134...但是122不允许,22重复。

这题其实一开始只要想对了思路就很简单。

  • 生成3位数
  • 放入Set去重
  • 去除Set集合中一串数字内出现相同的数字字符串

首先我们用高中数学的排列组合明确结果为24种:

然后按照思路先生成3位数:

	public static Set<StringBuffer> combine() {
        Set<StringBuffer> set = new HashSet<>();
        for(int i=1; i<=4; i++) {
            for(int j=1; j<=4; j++) {
                for(int k=1; k<=4; k++) {
                    StringBuffer sb = new StringBuffer();
                    sb.append(i).append(j).append(k);
                    set.add(sb);
                }
            }
        }
        return set;
    }

三个for循环就可以满足第一个要求,但是此时生成的数是这样的:

[
231, 311, 214, 324, 433, 442, 422, 221, 334, 332, 441, 432, 
234, 223, 414, 122, 144, 323, 242, 421, 331, 212, 411, 
233, 444, 313, 211, 344, 143, 341, 121, 243, 322, 141,
241, 112, 412, 222, 321, 424, 431, 131, 213, 123, 132, 
342, 443, 142, 111, 124, 114, 333, 134, 113, 232, 314,
224, 133, 343, 423, 434, 312, 413, 244
]

可以发现,存在 311 这类的数,就是这串数字内存在了相同的数字,所以下一步是去除这类字符串:

	public static Set<StringBuffer> combine() {
        Set<StringBuffer> set = new HashSet<>();
        for(int i=1; i<=4; i++) {
            for(int j=1; j<=4; j++) {
                for(int k=1; k<=4; k++) {
                    StringBuffer sb = new StringBuffer();
                    sb.append(i).append(j).append(k);
                    //如果这个数字串没有串内相同的情况,那么放入Set
                    if(checkSame(sb))
                        set.add(sb);
                }
            }
        }
        return set;
    }		
    
	public static boolean checkSame(StringBuffer stringBuffer) {
    	//转换成字符数组
        char[] chars = stringBuffer.toString().toCharArray();
        //由于字符串较短,可以采用这种一一比较组成值,观察是否有重复
        for(int i=0; i<chars.length; i++) {
            for(int j=i+1; j<chars.length; j++) {
                if(chars[i] == chars[j])
                    return false;
            }
        }
        return true;
    }

观察结果:

[
	124, 342, 413, 243, 423, 421, 132, 231, 341, 412, 321, 432, 
    142, 213, 234, 431, 143, 312, 241, 314, 123, 324, 214, 134
]

方法多种,这种方法理论上是存在优化的空间,(因为是我第一时间想到的,哈哈)先记录下来。

完整代码:

package com.message.api.test;
import java.util.HashSet;
import java.util.Set;

public class Test01 {

    public static void main(String[] args) {
        Set<StringBuffer> set = combine();
        System.out.println(set);
    }

    public static Set<StringBuffer> combine() {
        Set<StringBuffer> set = new HashSet<>();
        for(int i=1; i<=4; i++) {
            for(int j=1; j<=4; j++) {
                for(int k=1; k<=4; k++) {
                    StringBuffer sb = new StringBuffer();
                    sb.append(i).append(j).append(k);
                    if(checkSame(sb))
                        set.add(sb);
                }
            }
        }
        return set;

    }

    public static boolean checkSame(StringBuffer stringBuffer) {
        char[] chars = stringBuffer.toString().toCharArray();
        for(int i=0; i<chars.length; i++) {
            for(int j=i+1; j<chars.length; j++) {
                if(chars[i] == chars[j])
                    return false;
            }
        }
        return true;
    }
}