黑马程序员技术交流社区
标题:
一个java基础测试题
[打印本页]
作者:
wokua
时间:
2015-10-30 16:12
标题:
一个java基础测试题
输出任意字符串的全组合情况
如:
输入"abc"
输出结果为:
"a" "b" "c"
"ab" "ac" "bc" "ba" "ca" "cb"
"abc" "acb" "bca" "bac" "cab" "cba"
作者:
xingjiyuan26
时间:
2015-10-30 18:47
public class Test2 {
public static void main(String[] args) throws Throwable {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
String[] ss = str.split("");
for (int i = 1; i <= ss.length; i++) {
List<List<String>> result = parade(Arrays.asList(ss), i);
for (List<String> l : result) {
for (String string : l) {
System.out.print(string);
}
System.out.print(" ");
}
System.out.println();
// System.out.printf("total:%s\n", result.size());
}
}
public static List<List<String>> parade(List<String> data, int num) {
List<List<String>> result = new ArrayList<List<String>>();
if (num == 1) { // 只排一个元素的时候(递归结束条件)
for (String s : data) {
List<String> l = new ArrayList<String>();
l.add(s);
result.add(l); // 每个元素分别保存到结果集
}
return result; // 并返回结果集
}
for (int i = 0; i < data.size(); i++) { // num>1,即排多个元素的时候,循环
List<String> list = new ArrayList<String>(data);
list.remove(i); // 去掉当前循环的元素作为下次递归的参数,即剩余的元素做递归
List<List<String>> sub = parade(list, num - 1); // 递归调用
for (List<String> l : sub) { // 然后循环递归得到的结果
l.add(0, data.get(i)); // 把当前元素排在每个结果的前面
result.add(l); // 并保存到结果集
}
}
return result; // 最后返回结果集
}
}
复制代码
参考网上并修改的,不懂的地方一起探讨哈
作者:
xingjiyuan26
时间:
2015-10-30 18:56
xingjiyuan26 发表于 2015-10-30 18:47
参考网上并修改的,不懂的地方一起探讨哈
递归里的list可以考虑定义成LinkedList,因为删除、添加操作比较多,可以提高效率
作者:
mars314
时间:
2015-10-30 20:21
http://bbs.itheima.com/thread-242255-1-1.html
作者:
铁苯锌
时间:
2015-10-30 22:19
还没学到递归,好想看不懂啊
作者:
新火燎塬521
时间:
2015-10-31 12:08
我也是刚刚做过这道题,看看我的代码呗,但是一定要看懂啊,如果发现我的代码有什么问题一定指出来
public class Tes{
public static void main(String[] args) {
//创建Scanner对象,获取控制台输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个原始字符串");
//等待输入
String next = sc.next();
//将获取的字符串转换为字符数组,便于操作
char[] charArray = next.toCharArray();
System.out.println("原始字符串中所有字符组合如下:");
//打印一个字符的所有组合
for (int i = 0; i < charArray.length; i++) {
System.out.print("\""+charArray[i]+"\" ");
}
System.out.println();
//打印两个字符的所有组合
for (int i = 0; i < charArray.length; i++) {
for (int j = 0; j < charArray.length; j++) {
if(j!=i){
System.out.print("\""+charArray[i]+charArray[j]+"\" ");
}
}
}
System.out.println();
//打印三个字符的所有组合
for (int i = 0; i < charArray.length; i++) {
for (int j = 0; j < charArray.length; j++) {
for (int k = 0; k < charArray.length; k++) {
if (i!=j&&i!=k&&j!=k) {
if(j!=i){
System.out.print("\""+charArray[i]+charArray[j]+charArray[k]+"\" ");
}
}
}
}
}
}
}
复制代码
作者:
吃饭工作睡觉
时间:
2015-11-1 17:16
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
/**
* 第八题:编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,
* 例如:原始字符串是"abc",
* 打印得到下列所有组合情况:
* "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac"
* "abc" "acb" "bac" "bca" "cab" "cba"
*
* 分析:
* 通过将单个字符组合得到两个字符连在一起的双字符字符串,一次类推,直到得到所有字符组合。
* 将得到字符组合重新放入到TreeSet中,为该TreeSet添加Comparator匿名类,满足题目显示顺序要求。
* @author Administrator
*
*/
public class Test08 {
public static void main(String[] args) {
String str = "abcd";
printList(randomChars(str));
}
/**
*
* @param str 要查找字符组合的字符串
* @return 返回字符串中字符组合。
*/
public static List<String> randomChars(String str){
//初始化要存储新字符组合的列表对象。
List<String> list = new ArrayList<>();
//将传入的字符串参数分解为单个字符
String[] arr = str.split("");
//将但字符加入到列表集合中
for(String element : arr){
list.add(element);
}
//使用嵌套循环组合各种字符并且将新字符组合放入列表中。
for(int i = 0; i < list.size(); i++){ //外部循环,用于获取列表中已有字符串
for(int j = 0; j < arr.length; j++){ //内部循环,用于为原有的字符串加上字符。
//判断字符是否存在于某个字符串,不存在就加上。
if(!list.get(i).contains(arr[j])){
list.add(list.get(i) + arr[j]);
}
}
}
//返回获得的字符列表。
return list;
}
public static void printList(List<String> list){
//获得用匿名Comparator对象作为参数的TreeSet
TreeSet<String> tss = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
int len1 = str1.length();
int len2 = str2.length();
//如果字符长度相等,就按照字典顺序排列字符串
if(len1 == len2){
return str1.compareTo(str2);
}
//如果字符串长度不相等,就将短的字符串放到前面。
return len1 - len2;
}
});
//将参数中元素加入到TreeSet对象
tss.addAll(list);
//判断字符串长度
int length = 1;
//使用foreach循环遍历数组
for(String str : tss){
//如果字符串长度增加,就进行换行。
if(str.length() > length){
System.out.println();
length++;
}
System.out.print("\"" + str + "\" ");
}
}
}
复制代码
Perfect
作者:
菊花爆满山
时间:
2015-11-1 17:39
又来了
/*
需求:输出任意字符串的全组合情况如:
输入"abc"
输出结果为:
"a" "b" "c"
"ab" "ac" "bc" "ba" "ca" "cb"
"abc" "acb" "bca" "bac" "cab" "cba"
*/
import java.util.Scanner;
import java.util.ArrayList;
import java.util.ListIterator;
class Demo
{
public static void main(String[] args)
{
System.out.println("输入你要排列的字符串:");
//创建Scnnner扫描器对象 获取控制台输入
Scanner sc = new Scanner(System.in);
//等待输入
String str = sc.nextLine();
//把字符串转换成字符数组
char[] chr = str.toCharArray();
int len = chr.length;
//创建一个Arraylist对像 用于存储各种组合情况
ArrayList<String> al = new ArrayList<String>();
//返回一个ArrayList集合引用 该集合中存储了字符串各种组合情况 用newal来接受这个引用
ArrayList<String> newal = getGroups(al,chr,len);
//增强for遍历集合 和 打印所有情况
for(String s : newal)
{
System.out.println(s);
}
System.out.println("一共有:"+newal.size()+"个组合");
}
/*
这个函数的作用是将所有的组合情况存入ArrayList集合中
其中用到了递归 判断是否结束条件是n==1
*/
public static ArrayList<String> getGroups(ArrayList<String> al,char[] chr,int n)
{
if(n==1)
{
for(int x=0; x<chr.length ;x++)
{
al.add(chr[x]+"");
}
}
else
{
al = getGroups(al,chr,n-1);
for(int x=0; x<chr.length; x++)
{
ListIterator<String> it = al.listIterator();
while(it.hasNext())
{
String s = it.next();
String newstr = chr[x]+""+s;
/*
这里的if是判断字符是否重复和字符串是否重复
提示:其实可以用TreeSet来代替ArrayList集合 那么newstr.length()==n 这句就可以不要了
因为TreeSet元素不可以重复
我建议用TreeSet集合 同时可以自定义比较器 排列元素
我的这段代码可能导致输出无序 所以还是用TreeSet吧
楼主自己改吧 看到币还没送出 所以就写了 希望把币给我 缺技术分啊~~
*/
if((!s.contains(chr[x]+""))&&(newstr.length()==n))
it.add(newstr);
}
}
}
return al;
}
}
复制代码
作者:
新火燎塬521
时间:
2015-11-1 21:08
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class pai {
private static char[] is ;
private static int total;
private static int m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> iL = new ArrayList<Integer>();
System.out.println("请输入一串字符");
String next = sc.next();
is = next.toCharArray();
m=next.length();
for (int i = 1; i <= m; i++) {
new pai().plzh("", iL, i);
System.out.println();
}
System.out.println("total : " + total);
}
private void plzh(String s, List<Integer> iL, int m) {
if(m == 0) {
System.out.print(s+"\t");
total++;
return;
}
List<Integer> iL2;
for(int i = 0; i < is.length; i++) {
iL2 = new ArrayList<Integer>();
iL2.addAll(iL);
if(!iL.contains(i)) {
String str = s + is[i];
iL2.add(i);
plzh(str, iL2, m-1);
}
}
}
}
复制代码
网上找到的 稍作修改。
作者:
洛克先生EN
时间:
2015-11-3 17:44
黑马面试题么?
作者:
小臣臣
时间:
2015-11-4 08:44
xingjiyuan26 发表于 2015-10-30 18:47
参考网上并修改的,不懂的地方一起探讨哈
赞一个!!!
作者:
478883662
时间:
2015-11-4 09:20
方法很多,String里有个CharAt(index)方法,可遍历任意一个字符串即可
//new一个集合来存放
List list=new ArrayList();
//遍历
for(int i=0;i<str.length();i++){
//添加到集合中
list.add( str.CharAt(i)+"");
}
System out println(list);
作者:
新火燎塬521
时间:
2015-11-5 12:20
http://blog.csdn.net/qq_23077365/article/details/49582563
作者:
萧未然
时间:
2015-11-10 17:58
我也遇到了这个面试题:给出我写的答案
import java.util.*;
/**
* 第7题:编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
* 原始字符串是"abc",打印得到下列所有组合情况:
* 思路:通过对如下排列观察,发现字符串中,总是有重复的部分,只要把重复的部分取出,
* 把剩下的连接,再重复以上操作即可
*"a" "b" "c"
*"ab" "bc" "ca" "ba" "cb" "ac"
*"abc" "acb" "bac" "bca" "cab" "cba"
* @author Administrator
*
*/
public class Test7 {
public static int count;//计数器--记录某一字符串任意不重复组合情况个数
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
//开始
while(true){
count=0;
System.out.print("请输入(输入over结束):");
String str=input.next();//得到键盘录入字符串
if(str.equals("over"))break;//循环截止
getRange("",str);//调用方法求组合情况
System.out.println("\n"+str+"有以上"+count+"种任意不重复组合情况");
}
}
/**
* 发现:把字符串分成左右可改变和不可改变的部分,先循环得到每个字符的不同组成,再递归求解
* @param strLeft 组合的不可变部分
* @param strRight 组合可变部分
*/
public static void getRange(String strLeft,String strRight){
for(int i=0;i<strRight.length();i++){//循环,得到每次右边的组合情况
StringBuilder sb = new StringBuilder(strRight);//转换成StringBuilder
String str = strLeft+strRight.substring(i, i+1);
System.out.println(str);;//不可变部分+当前字符就等于当前的组合情况
count++;
getRange(str,sb.deleteCharAt(i).toString());
//使用StringBuilder方法deleteCharAt删除当前当做可改变部分参数,再递归得到其他组合
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2