字符串排序算法, 哪位大侠给看下...

cnjzy0106 2010-06-02 05:10:20
要求 : 用户输入"1234"
返回结果
1324
1342
1432
1423
1243
1234
2431
2413
2143
2134
2314
2341
3142
3124
3214
3241
3421
3412
4213
4231
4321
4312
4132
4123


这样, 返回这个字符串中字符所有能组成的字符串集合

小弟写了一个,但是4位字符以下还行,多了以后就有地方少循环了。

public static void main(String[] args) {
TestReverse t = new TestReverse();
String str = "1234";
List<String> list = t.permutation(str);
System.out.println("共有数据:"+list.size());
for(int i = 0 ; i < list.size() ; i++){
System.out.println(list.get(i));
}
}


/**
* 排列字符串
* @param str 源字符串
* @return List<String>
*/
public List<String> permutation(String str){
//创建返回集合,避免空指针
List<String> list = new ArrayList<String>();
try{
//创建char数组
char [] c = str.toCharArray();
//颠倒字符串用
char b = 0;
//遍历char数组,让每个字符都当一首头字符
for (int i = 0; i < c.length; i++) {
//颠倒除了首字符外所有字符串
rvd(c,list);
b = c[0];
//颠倒首字符
for(int j = 0 ; j < c.length-1 ; j++){
c[j] = c[j+1];
}
c[c.length-1] = b;
}
}catch(Exception e){
System.out.println("翻转字符串错误:"+e);
}
return list;
}


/**
* 颠倒字符串
* @param c 字符集合
* @param list 返回字符串集合
* @return List<String>
*/
public List<String> rvd(char[] c , List<String> list){
try{
//克隆一个字符集合给m , 避免影响到源字符集合
char [] m = c.clone();
//用以当做第三方字符 , 颠倒字符用
char b = 0;
//除了第一个字符外,所有字符全部颠倒一回
for(int i = 1 ; i < m.length ; i++){
for(int j = 1 ; j < m.length-1 ; j++){
b = m[j];
m[j]=m[j+1];
m[j+1]=b;
list.add(new String(m));
}
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}

...全文
234 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhji123 2010-06-03
  • 打赏
  • 举报
回复

public static void main(String[] agrs) throws Exception {
List<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("4");
sort(list,"");

}
static String temp="";
public static void sort(List<String> cs ,String s) {


for(int i=0;i<cs.size();i++){

if(cs.size()==1){
temp=s+cs.get(i);
System.out.println("resault:"+temp);

}
else{
temp=s+cs.get(i);

List<String> list = new ArrayList<String>();
for(int z=0;z<cs.size();z++){
if(!cs.get(i).equals(cs.get(z))){
list.add(cs.get(z));

}
}

sort(list,temp);
}
}

}
zhji123 2010-06-03
  • 打赏
  • 举报
回复
public static void main(String[] agrs) throws Exception {
List<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("4");
sort(list,"");

}
static String temp="";
public static void sort(List<String> cs ,String s) {


for(int i=0;i<cs.size();i++){

if(cs.size()==1){
temp=s+cs.get(i);
System.out.println("resault:"+temp);

}
else{
temp=s+cs.get(i);

List<String> list = new ArrayList<String>();
for(int z=0;z<cs.size();z++){
if(!cs.get(i).equals(cs.get(z))){
list.add(cs.get(z));

}
}

sort(list,temp);
}
}

}
dr_lou 2010-06-03
  • 打赏
  • 举报
回复
package com.xuz.datastruct.recursion;

public class AnagramApp {
private char[] chArray = new char[100];
private int size ;
private int count ;

public static void main(String[] args) {
String str = "1234";
new AnagramApp().play(str);
}

public void play(String str){
chArray = str.toCharArray();
size = str.length();
doAnagram(size);
}

private void doAnagram(int size2) {
if (size2 == 1) {
return ;
}

for (int i = 0; i < size2; i++) {
doAnagram(size2-1);
if (size2 == 2) {
displayWord();
}
rotate(size2);
}
}

private void rotate(int size3) {
int i ;
int pos = size - size3;
char temp = chArray[pos];
for (i = pos + 1; i < size; i++) {
chArray[i-1] = chArray[i];
}
chArray[i - 1] = temp;
}

private void displayWord() {
if (count < 99) {
System.out.print(" ");
}
if (count < 9) {
System.out.print(" ");
}
System.out.print(++count + " ");
for (int i = 0; i < size; i++) {
System.out.print(chArray[i]);
}
System.out.print(" ");
if (count % 6 == 0) {
System.out.println();
}
}
}


递归的。
javaleo918 2010-06-03
  • 打赏
  • 举报
回复
public class AnagramApp {

static int size;
static int count;
static char[] arrChar = new char[100];

public static void main(String[] args) throws IOException{
System.out.print("Enter a word:");
String input = getString();
size = input.length();
count = 0;
for(int j=0;j<size;j++)
arrChar[j]=input.charAt(j);
doAnagram(size);
}

public static void doAnagram(int newSize){
if(newSize==1)
return;
for(int j=0;j<newSize;j++){

doAnagram(newSize-1);
if(newSize==2)
displayWord();
rotate(newSize);
}
}

public static void rotate(int newSize){
int j;
int position = size-newSize;
char temp = arrChar[position];
for(j=position+1;j<size;j++)
arrChar[j-1]=arrChar[j];
arrChar[j-1] = temp;
}

public static void displayWord(){
if(count<99)
System.out.print(" ");
if(count<9)
System.out.print(" ");
System.out.print(++count+" ");
for(int j=0;j<size;j++)
System.out.print(arrChar[j]);
System.out.print(" ");
System.out.flush();
if(count%6==0)
System.out.println("");
}

public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
}
javaleo918 2010-06-03
  • 打赏
  • 举报
回复
递归,大家一同进步。应该是你想要的
public class tester {

static int size;
static int count;
static char[] arrChar = new char[100];

public static void main(String[] args) throws IOException{
System.out.print("Enter a word:");
String input = getString();
size = input.length();
count = 0;
for(int j=0;j<size;j++)
arrChar[j]=input.charAt(j);
doAnagram(size);
}

public static void doAnagram(int newSize){
if(newSize==1)
return;
for(int j=0;j<newSize;j++){

doAnagram(newSize-1);
if(newSize==2)
displayWord();
rotate(newSize);
}
}

public static void rotate(int newSize){
int j;
int position = size-newSize;
char temp = arrChar[position];
for(j=position+1;j<size;j++)
arrChar[j-1]=arrChar[j];
arrChar[j-1] = temp;
}

public static void displayWord(){
if(count<99)
System.out.print(" ");
if(count<9)
System.out.print(" ");
System.out.print(++count+" ");
for(int j=0;j<size;j++)
System.out.print(arrChar[j]);
System.out.print(" ");
System.out.flush();
if(count%6==0)
System.out.println("");
}

public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
}
wu_huiwen 2010-06-02
  • 打赏
  • 举报
回复
为10分 回个贴。忙了今天没来
  • 打赏
  • 举报
回复
不懂,顶一下
Headsen 2010-06-02
  • 打赏
  • 举报
回复
递归和迭代的本质是一样的,但高手是很少写递归的,递归编译器还是会解析为迭代再执行,同时消耗很大资源。不过递归容易理解且代码简单。
//写个递归的伪码
fun(a){
if(length==1) print(a[0])
if(length==2) {print(a[0],a[1]),print(a[1],a[0])}
}
if(length>2){
for (i 0:length-1){
print(a[i]),a(a.remove(a[i]))
}
}
dr_lou 2010-06-02
  • 打赏
  • 举报
回复
等我明天给你一个递归的。
littleJP 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gesanri 的回复:]
不就是全排列么
核心思想是:依次取出字符串中每一个元素,放在第一位,完后对剩下的元素进行全排列(递归),最后把所有的情况罗列出来,不重复造轮子


Java code

import java.util.ArrayList;

import java.util.List;

public class Permutation {

private static List<In……
[/Quote]
顶一下哈
cnjzy0106 2010-06-02
  • 打赏
  • 举报
回复
补充下
返回字符串集合结果的个数应该是 输入字符串长度的乘积
gesanri 2010-06-02
  • 打赏
  • 举报
回复
不就是全排列么
核心思想是:依次取出字符串中每一个元素,放在第一位,完后对剩下的元素进行全排列(递归),最后把所有的情况罗列出来,不重复造轮子


import java.util.ArrayList;

import java.util.List;

public class Permutation {

private static List<Integer> list = new ArrayList<Integer>();

private static int total;

/**

* @param args

*/

public static void main(String[] args) {
String str = "1234";
for(int i = 0; i < str.length(); i++)
list.add(Integer.parseInt(str.substring(i,i + 1)));

perm(list, new ArrayList<Integer>());

System.out.println("total: " + total);

}

private static void perm(List<Integer> list, List<Integer> removed) {

int length = list.size();

if (length == 1) {

for (int value : removed) {

System.out.print(value + " ");

}

System.out.println(list.get(0));

total++;

} else {

for (int i = 0; i < length; i++) {

List<Integer> temp = new ArrayList<Integer>();

temp.addAll(list);

temp.remove(i);

List<Integer> holder = new ArrayList<Integer>();

holder.addAll(removed);

holder.add(list.get(i));

perm(temp, holder);

}

}

}

}
cwjieNo1 2010-06-02
  • 打赏
  • 举报
回复
全排列网上很多啊·baidu一下·
kuruby 2010-06-02
  • 打赏
  • 举报
回复
很有趣。来学习下。
b11ght 2010-06-02
  • 打赏
  • 举报
回复
全排列么?
cnjzy0106 2010-06-02
  • 打赏
  • 举报
回复
自己先顶下
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧