名气笔试:楚楚街2016招聘笔试(解密)
题目描述
亮亮深吸一口气,小心地将盒子打开,里面是一张地图,地图上除了一些奇怪的字母以外没有任何路线信息,这可让亮亮犯了愁,这些字母代表了什么意思呢? 亮亮绞尽脑汁也想不出什么思路,突然,亮亮眼前一亮,“我可以把这些字母所有的排列方式全部写出来,一定可以找到答案!”于是,亮亮兴奋的开始寻找字母里的秘密。
输入描述:
每组数据输入只有一行,是一个由不同的大写字母组成的字符串,已知字符串的长度在1到9之间,我们假设对于大写字母有’A’ < ‘B’ < … < ‘Y’ < ‘Z’。
输出描述:
输出这个字符串的所有排列方式,每行一个排列,要求字母序比较小的排列在前面。
输入例子:
WHL
输出例子:
HLW
HWL
LHW
LWH
WHL
题目描述
亮亮深吸一口气,小心地将盒子打开,里面是一张地图,地图上除了一些奇怪的字母以外没有任何路线信息,这可让亮亮犯了愁,这些字母代表了什么意思呢? 亮亮绞尽脑汁也想不出什么思路,突然,亮亮眼前一亮,“我可以把这些字母所有的排列方式全部写出来,一定可以找到答案!”于是,亮亮兴奋的开始寻找字母里的秘密。
输入描述:
每组数据输入只有一行,是一个由不同的大写字母组成的字符串,已知字符串的长度在1到9之间,我们假设对于大写字母有’A’ < ‘B’ < … < ‘Y’ < ‘Z’。
输出描述:
输出这个字符串的所有排列方式,每行一个排列,要求字母序比较小的排列在前面。
输入例子:
WHL
输出例子:
HLW
HWL
LHW
LWH
WHL
WLH
java版本的代码实现:
package cn.cat.algorithm;
import java.util.TreeSet;
public class Decode {
/**
* 分析:此题需要借助递归的方式最简便,需要注意全排序时,字母顺序更改后,需要还原字母顺序,以便于下一轮的排序使用。
* 题目还要求使用按字母序输出,故需要将全排序结果全部存放到集合中,然后再统一排序输出,此处可以直接借助JDK的TreeSet来快速实现。
*
* @Description:
* @author gwj
* @Created 2018年4月18日 下午4:42:04
* @param args
*/
public static void main(String[] args) {
String str = "WHL";
char[] charArr = str.toCharArray();
//因为需要按字母序输出,故先将结果存储到集合中。
TreeSet<String> treeSet = new TreeSet<String>();
//全排序
permutation(charArr, 0, treeSet);
//ThreeSet本身就是按字典顺序排序的,直接输出即可。
for (String s : treeSet) {
System.out.println(s);
}
}
/** 排列字符
* @Description:
* @author gwj
* @Created 2018年4月19日 上午9:53:08
* @param cs 字符数组
* @param index 排序的起始索引
* @param set 存放排序结果的集合
*/
static void permutation(char[] cs, int index, TreeSet<String> set) {
if (index >= cs.length) {
set.add(new String(cs));
return;
}
for (int i = index; i < cs.length; i++) {
swap(cs, index, i);
//递归调用
permutation(cs, index + 1, set);
//恢复交换的字母
swap(cs, index, i);
}
}
/** 交换数组元素位置
* @Description:
* @author gwj
* @Created 2018年4月18日 下午5:25:31
* @param charArr
* @param x
* @param y
*/
static void swap(char[] charArr, int x, int y) {
char temp = charArr[x];
charArr[x] = charArr[y];
charArr[y] = temp;
}
}