面试问题,求解 先用 StringTokenizer 得到一字符数组String[] sentence对数 1,2,3,... sentence.length 进行组合。只要实现排列组合就可以了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 "对数 1,2,3,... sentence.length 进行组合。"我认为关键就在这个地方,算法的好坏也在这。 下面只是输出一组随机产生的数据如果想一直输出下去,则将处理至输出部分循环便是,当然在最开头需将strs字符串组copy置另一String数组如oldStr(循环中的strs全部用oldStr替换即可),因为程序必须保证strs不变,且每次开始循环的时候都必须重置oldStr为strs的copy另外,如果需要输出全部的组合,这样随机生成肯定是不行的,那则需要另外的处理只输出一组随机组合的代码如下:import java.io.*;import java.util.*;public class StrChange { public static void main(String[] args) { try { DataInputStream in = new DataInputStream(System.in); String str = in.readLine(); String[] strs = new String[str.length()];//保证够长 int i = 0; StringTokenizer st = new StringTokenizer(str);//接收输入字符串 while (st.hasMoreTokens()) {//分空格处理 strs[i] = st.nextToken(); i++; } int k = i; int g = 0; String[] newStr = new String[k]; //begin for(i=0;i<k;i++) { Random rm = new Random(); int j = rm.nextInt(k-i);//随机生成小于总字符个数的随机数,即取随机对应字串 //System.out.println(j); newStr[i] = strs[j];//转换 for(g=j;g<k;g++){ strs[g] = strs[g+1];//将此字串取出后,后面的字串前移 } } //end String strOut = "";//组织输出 for(i=0;i<k;i++) { if(i==0) { strOut = newStr[i]; } else { strOut = strOut + " " + newStr[i]; } } System.out.println(strOut);//输出一组随机结果 } catch(Exception e) { System.out.println(e); } }} 我想了一下,最好的方法应该是递归了!每次你用for循环从长度为n的数组中取出一个值,这样下一次你只要从剩下的(n-1)值中再抽出一个,这样递归到只剩下一个的时候就搞定了!你试试!呵呵! 递归,可运行, jbuilder3.0package untitled8;import java.util.*;public class MyClassCSDN { public MyClassCSDN() { } public static void main(String[] args) { MyClassCSDN myClassCSDN = new MyClassCSDN(); myClassCSDN.invokedStandalone = true; ArrayList l=new ArrayList(); l.add ("I"); l.add ("am"); l.add ("a"); l.add ("good"); l.add ("man"); ArrayList temp=myClassCSDN.N(l); for ( int i=0;i<temp.size ();i++){ System.out.println((String)temp.get (i)); } } private boolean invokedStandalone = false; public ArrayList N (ArrayList list){ ArrayList result=new ArrayList(); if ( list.size ()==1 ) return list; else { for ( int i=0;i<list.size ();i++){ String head=(String)list.get (i); ArrayList templist=(ArrayList)list.clone (); templist.remove (i); ArrayList tempresult=N(templist); if ( ! tempresult.isEmpty () ) { for ( int k=0;k<tempresult.size ();k++){ result.add (head+" "+tempresult.get (k)) ; } } } } return result; }} 看我这个,也是用递归import java.util.*;public class TestStr { public TestStr() { } public void outString(String test) { StringTokenizer strtoken=new StringTokenizer(test); int count=strtoken.countTokens(); String[] ken=new String[count]; int i=0; while(strtoken.hasMoreElements()) { ken[i]=strtoken.nextToken(); i++; } String outstr =new String(" "); arrangeString(ken,count,outstr); } public void arrangeString(String[] ken,int count,String outstr){ String tempstr=outstr; for(int i=0;i<count;i++) { int tempcount=count; outstr=tempstr; outstr=outstr.concat(" "+ken[i]); if(tempcount==1){ System.out.println(outstr); return; } tempcount-=1; String[] kentemp=new String[tempcount]; int k=0; for(k=0;k<i;k++) { kentemp[k]=ken[k]; } for(int h=k;h<tempcount;h++) { kentemp[h]=ken[h+1]; } arrangeString(kentemp,tempcount,outstr); } } public static void main(String[] args) { TestStr testStr1 = new TestStr(); String test="i am a good man"; testStr1.outString(test); }} 列出单词的全部组合?输入一句话:The book on the desk is the best book 晕,居然现在才发现自己做错了方向……to lci21(元戈)改动一下楼上cianiao(才鸟)的一下就可以接收键盘输入了package javatest;import java.io.*;import java.util.*;public class MyClassCSDN {0A public MyClassCSDN() { } public static void main(String[] args) { try { MyClassCSDN myClassCSDN = new MyClassCSDN(); // myClassCSDN.invokedStandalone = true; // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //DataInputStream in = new DataInputStream(new BufferedInputStream(System.in)); String str = br.readLine(); //String str = in.readLine(); String[] strs = new String[str.length()];//保证够长 int i = 0; StringTokenizer st = new StringTokenizer(str);//接收输入字符串 while (st.hasMoreTokens()) {//分空格处理 strs[i] = st.nextToken(); i++; } int k = i; ArrayList l=new ArrayList(); for(i=0;i<k;i++) { l.add(strs[i]); } ArrayList temp=myClassCSDN.N(l); for (i=0;i<temp.size ();i++){ System.out.println((String)temp.get (i)); } } catch(IOException e) {0A System.out.println(e);0D } } // private boolean invokedStandalone = false; public ArrayList N (ArrayList list){ ArrayList result=new ArrayList(); if ( list.size ()==1 ) return list; else { for ( int i=0;i<list.size ();i++){ String head=(String)list.get (i); ArrayList templist=(ArrayList)list.clone ();0A templist.remove (i);0D ArrayList tempresult3DN(templist); if ( ! tempresult.isEmpty () ) { for ( int k=0;k<tempresult.size ();k++){ result.add (head2B" "+tempresult.get (k)) ; } } } } return result; }}==============================================================如上所言,并非完全正确,请从建议的角度、用怀疑的眼光批判地接收 靠,csdn工具怎么这么多bug居然自动生成OA OD之类的数据……sigh==============================================================如上所言,并非完全正确,请从建议的角度、用怀疑的眼光批判地接收 java 算法 Random(随机数) 高分求救,关于抓取的奇怪的问题 netbean 中调用dll怎么用 jawin Java开发网站有什么优势? 关于如何用类中的数据结构 这个焦点失去事件怎么处理? ~~文档中的字符~~~疑问! 谁是高手谁来看看这两道题怎么回事情 字符串-->字节数组,请教各位了,谢谢 请问如何编程实现隐藏文件夹和文件?
我认为关键就在这个地方,算法的好坏也在这。
如果想一直输出下去,则将处理至输出部分循环便是,当然在最开头需将strs字符串组copy置另一String数组如oldStr(循环中的strs全部用oldStr替换即可),因为程序必须保证strs不变,且每次开始循环的时候都必须重置oldStr为strs的copy
另外,如果需要输出全部的组合,这样随机生成肯定是不行的,那则需要另外的处理
只输出一组随机组合的代码如下:
import java.io.*;
import java.util.*;public class StrChange {
public static void main(String[] args) {
try {
DataInputStream in = new DataInputStream(System.in);
String str = in.readLine();
String[] strs = new String[str.length()];//保证够长
int i = 0;
StringTokenizer st = new StringTokenizer(str);//接收输入字符串
while (st.hasMoreTokens()) {//分空格处理
strs[i] = st.nextToken();
i++;
}
int k = i;
int g = 0;
String[] newStr = new String[k];
//begin
for(i=0;i<k;i++) {
Random rm = new Random();
int j = rm.nextInt(k-i);//随机生成小于总字符个数的随机数,即取随机对应字串
//System.out.println(j);
newStr[i] = strs[j];//转换
for(g=j;g<k;g++){
strs[g] = strs[g+1];//将此字串取出后,后面的字串前移
}
}
//end
String strOut = "";//组织输出
for(i=0;i<k;i++) {
if(i==0) {
strOut = newStr[i];
}
else {
strOut = strOut + " " + newStr[i];
}
}
System.out.println(strOut);//输出一组随机结果
}
catch(Exception e) {
System.out.println(e);
}
}
}
每次你用for循环从长度为n的数组中取出一个值,这样下一次你只要从剩下的(n-1)值中再抽出一个,这样递归到只剩下一个的时候就搞定了!你试试!呵呵!
递归,可运行, jbuilder3.0package untitled8;
import java.util.*;public class MyClassCSDN { public MyClassCSDN() {
} public static void main(String[] args) {
MyClassCSDN myClassCSDN = new MyClassCSDN();
myClassCSDN.invokedStandalone = true; ArrayList l=new ArrayList();
l.add ("I");
l.add ("am");
l.add ("a");
l.add ("good");
l.add ("man"); ArrayList temp=myClassCSDN.N(l);
for ( int i=0;i<temp.size ();i++){
System.out.println((String)temp.get (i));
} }
private boolean invokedStandalone = false; public ArrayList N (ArrayList list){
ArrayList result=new ArrayList();
if ( list.size ()==1 ) return list;
else {
for ( int i=0;i<list.size ();i++){
String head=(String)list.get (i);
ArrayList templist=(ArrayList)list.clone ();
templist.remove (i);
ArrayList tempresult=N(templist);
if ( ! tempresult.isEmpty () ) {
for ( int k=0;k<tempresult.size ();k++){
result.add (head+" "+tempresult.get (k)) ;
}
}
}
}
return result;
}
}
import java.util.*;
public class TestStr { public TestStr() {
}
public void outString(String test)
{
StringTokenizer strtoken=new StringTokenizer(test);
int count=strtoken.countTokens();
String[] ken=new String[count];
int i=0;
while(strtoken.hasMoreElements())
{
ken[i]=strtoken.nextToken();
i++;
}
String outstr =new String(" ");
arrangeString(ken,count,outstr);
} public void arrangeString(String[] ken,int count,String outstr){
String tempstr=outstr;
for(int i=0;i<count;i++)
{
int tempcount=count;
outstr=tempstr;
outstr=outstr.concat(" "+ken[i]);
if(tempcount==1){
System.out.println(outstr);
return;
}
tempcount-=1;
String[] kentemp=new String[tempcount];
int k=0;
for(k=0;k<i;k++)
{
kentemp[k]=ken[k];
}
for(int h=k;h<tempcount;h++)
{
kentemp[h]=ken[h+1];
}
arrangeString(kentemp,tempcount,outstr);
}
} public static void main(String[] args) {
TestStr testStr1 = new TestStr();
String test="i am a good man";
testStr1.outString(test);
}
}
输入一句话:The book on the desk is the best book
to lci21(元戈)
改动一下楼上cianiao(才鸟)的一下就可以接收键盘输入了package javatest;
import java.io.*;
import java.util.*;public class MyClassCSDN {
0A
public MyClassCSDN() {
} public static void main(String[] args) {
try {
MyClassCSDN myClassCSDN = new MyClassCSDN();
// myClassCSDN.invokedStandalone = true;
//
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));
String str = br.readLine();
//String str = in.readLine();
String[] strs = new String[str.length()];//保证够长
int i = 0;
StringTokenizer st = new StringTokenizer(str);//接收输入字符串
while (st.hasMoreTokens()) {//分空格处理
strs[i] = st.nextToken();
i++;
}
int k = i;
ArrayList l=new ArrayList();
for(i=0;i<k;i++) {
l.add(strs[i]);
} ArrayList temp=myClassCSDN.N(l);
for (i=0;i<temp.size ();i++){
System.out.println((String)temp.get (i));
}
}
catch(IOException e) {
0A System.out.println(e);0D
}
}
// private boolean invokedStandalone = false; public ArrayList N (ArrayList list){
ArrayList result=new ArrayList();
if ( list.size ()==1 ) return list;
else {
for ( int i=0;i<list.size ();i++){
String head=(String)list.get (i);
ArrayList templist=(ArrayList)list.clone ();
0A templist.remove (i);0D
ArrayList tempresult3DN(templist);
if ( ! tempresult.isEmpty () ) {
for ( int k=0;k<tempresult.size ();k++){
result.add (head2B" "+tempresult.get (k)) ;
}
}
}
}
return result;
}
}
==============================================================
如上所言,并非完全正确,请从建议的角度、用怀疑的眼光批判地接收
居然自动生成OA OD之类的数据……
sigh
==============================================================
如上所言,并非完全正确,请从建议的角度、用怀疑的眼光批判地接收