面试题。不难,记录下来给找工作的小伙伴参考,或许能起些作用。
题目:给定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;
}
}