黑马程序员技术交流社区
标题:
这道题怎么破?有好心人么?
[打印本页]
作者:
november
时间:
2014-2-18 22:54
标题:
这道题怎么破?有好心人么?
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
作者:
itpower
时间:
2014-2-18 23:21
import java.io.*;
import java.util.*;
public class pllll {
public static void main(String[] args)throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String p=br.readLine();
yy(br,p );
}
public static void yy(BufferedReader br,String p ) throws Exception
{
int i,j; String ee=p; String r = null,t = null,q=null ;
List<String>list=new ArrayList<String>();
///////////////////////////////////////////////////////////////////
for(i=0;i<p.length();i++)
{
// sop(p.substring(i,i+1)+" ");////////////第一行
}
// System.out.println();
////////////////////////////////////////////////////////////////////
for(i=0;i<p.length();i++)
{
for(j=0;j<p.length();j++)
{
if(i!=j)
{
r=p.substring(i, i+1);
t=ee.substring(j,j+ 1);
q=r+t;
list.add(q);
//sop(q+" "); ////////////第二行
}
}
}
////////////////////////////////////////////////////////////////////
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
ee= iterator.next();
//sop(ee);
yy(ee,p);
}
}
public static void yy(String ee,String p) throws Exception
{ List<String>list=new ArrayList<String>();
int i,j; int k=2;
String r = null,t = null,q=null ;
for(i=0;i<p.length();i++)
{
r=p.substring(i, i+1);
t=ee.substring(0, k);//as ad sa sd da ds ,(0, 2)就是1,2位的,每个(as)(ad)....都是1,2位的即sop(t+" ");输出as ad sa sd da ds
q=r+t;
list.add(q);
sop(q+" ");
}
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
ee= iterator.next();
if(k<p.length()+1)
{ k++;
yy(ee,p) ;
}
}
}
public static void sop(Object obj)
{
System.out.print(obj);
}
}
复制代码
作者:
75100313
时间:
2014-2-18 23:57
package com.mth.test;
/*
*上下对称
"a" "b" "c"
"ab" "bc" "ca"
"ba" "cb" "ac"
"abc" "bca" "cab"
"cba" "acb" "bac"
*
*
* 解题思路: 把abc变成数组 数组有下标 根据下标组合来打印
*
* */
public class CharTest {
public static void main(String[] args) {
String string = "abc";
// 变成字符数组
char[] array = string.toCharArray();
//第一行
for (char a : array) {
System.out.print(a);
System.out.print(" ");
}
System.out.println();
//第二行
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
System.out.print(array[array.length - 1] + ""
+ array[array.length - 3]);
System.out.print(" ");
System.out.print(array[array.length - 3] + ""
+ array[array.length - 1]);
} else {
System.out.print(array[i] + "" + array[i + 1]);
System.out.print(" ");
System.out.print(array[i + 1] + "" + array[i]);
}
System.out.print(" ");
}
System.out.println();
//第三行
for (int i = 0; i < array.length; i++) {
if (i == 1) {
System.out.print(array[i] + "" + array[i + 1] + ""
+ array[i - 1]);
System.out.print(" ");
System.out.print(array[i - 1] + "" + array[i + 1] + ""
+ array[i]);
} else if (i == 2) {
System.out.print(array[i] + "" + array[i - 2] + ""
+ array[i - 1]);
System.out.print(" ");
System.out.print(array[i - 1] + "" + array[i - 2] + ""
+ array[i]);
} else {
System.out.print(array[i] + "" + array[i + 1] + ""
+ array[i + 2]);
System.out.print(" ");
System.out.print(array[i + 2] + "" + array[i + 1] + ""
+ array[i]);
}
System.out.print(" ");
}
}
}
复制代码
作者:
疲劳的小马
时间:
2014-2-19 01:15
我基础测试也有这一题。。还没学到吧。等学完我自己试着做看看。。先回复下
作者:
疲劳的小马
时间:
2014-2-27 02:26
75100313 发表于 2014-2-18 23:57
你这个是。。手动把它的每种组合情况都打印了- -!那要是原字符串很长或者有空格怎么办?
作者:
眷恋之地
时间:
2014-2-27 15:37
理论上内存足够大的情况下可以生成任意长度字符串的所有字符的组合
/*
* 需求:
* 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
* 例:原始字符串是"abc",打印得到下列所有组合情况
* "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac"
* "abc" "acb" "bac" "bca" "cab" "cba"
*/
import java.io.*;
import java.util.*;
public class BasicTest
{
public static void main(String[] args) throws Exception
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = bufr.readLine();
if(!valiStr(line))
{
System.out.println("输入的字符串中有重复的字符");
System.exit(0);
}
char[] charArr = line.toCharArray();
for(int x=1; x<=charArr.length; x++)
{
List<String> list = getCombineList(charArr, x);
System.out.println(x+"个字符的组合共有"+getCombineNumber(charArr, x)+"种组合:");
Iterator<String> it = list.iterator();
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
System.out.println();
}
}
public static boolean valiStr(String str)
{
char[] arr = str.toCharArray();
List<String> list = new ArrayList<String>();
for(int i=0; i<arr.length; i++)
{
String tmp = new String(arr,i,1);
if(list.contains(tmp))
{
return false;
}
list.add(tmp);
}
return true;
}
public static int getCombineNumber(char[] charArr,int x)
{
int len = charArr.length;
int total = 1;
for(int i=0; i<x; i++)
{
total *= (len-i);
}
return total;
}
public static List<Integer> getIndexList(char[] charArr)
{
List<Integer> indexList = new ArrayList<Integer>();
for(int j=0; j<charArr.length; j++)
{
indexList.add(j);
}
return indexList;
}
public static String getRandomStr(char[] charArr,int x)
{
List<Integer> indexList = getIndexList(charArr);
int ilNum = indexList.size();
Random r = new Random();
char[] tmpArr = new char[x];
for(int i=0; i<x; i++)
{
int t = r.nextInt(ilNum-i);
tmpArr[i] = charArr[indexList.get(t)];
indexList.remove(t);
}
return new String(tmpArr);
}
public static List<String> getCombineList(char[] charArr,int x)
{
int total = getCombineNumber(charArr, x);
List<String> list = new ArrayList<String>();
while(true)
{
String str = getRandomStr(charArr, x);
if(list.contains(str))
continue;
list.add(str);
if(list.size() == total)
break;
}
return list;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2