面试一个编程题,没做出来帮我看看
现在有int sss [] = {4,5,8,9},写一段程序让程序输出sss这个数组的所有排序!
比如说4,5,8,9
4,5,9,8
4,9,5,8
4,9,8,5等等所有的排序种类,总共应该是24种,这个程序应该怎么编写?谢谢
[解决办法]
最苯的就是定义好四个ABCD,然后。。。。。。。。,我也忘了,嘿嘿。
[解决办法]
怎么没人回贴
[解决办法]
用循环啊
[解决办法]
递归
[解决办法]
- Java code
public class Test { private void queue(int[] sss, int[] ss1) { if (sss.length > 1) { int[] yyy = new int[sss.length - 1]; int[] yy1 = new int[ss1.length + 1]; for (int i = 0; i < sss.length; i++) { int sum; for (int j = 0; j < yyy.length; j++) { if (j < i) sum = j; else sum = j + 1; yyy[j] = sss[sum]; } for (int k = 0; k < ss1.length; k++) { yy1[k] = ss1[k]; } yy1[yy1.length - 1] = sss[i]; queue(yyy, yy1); } } else { for (int s : ss1) System.out.print(s + " "); System.out.println(sss[0]); } } public void taxis(int[] sss) { int[] ss1 = new int[0]; queue(sss, ss1); } public static void main(String[] args) { int[] sss = { 4, 5, 8, 9 }; Test test = new Test(); test.taxis(sss); }}
[解决办法]
多重循环排下 没想到其他办法
[解决办法]
用递归最好解决。。。
或者用N(N=sss.length)重循环。。。
[解决办法]
关注....
[解决办法]
我想了一小时还没写出来呢,总考虑不周到,落伍了!!
[解决办法]
void Perm(int list[], int k, int m) {
int i;
if (k == m) {
for (i = 0; i <= m; i++)
cout << a[i] << " ";
cout << endl;
} else
for(i=k; i <= m; i++) {
Swap(list[k], list[i]);
Perm(list, k+1, m);
Swap(list[k], list[i]);
}
}
void Swap(int & a, int &b) {
int t = a;
a = b;
b = t;
}
[解决办法]
推荐看看java版的数据结构
[解决办法]
6楼写的不错,我看了一会 写了一个 没执行出来.
这种算法 最重要是思想. 看你怎么去想了.
[解决办法]
方法一
应用回溯法,每个数的取法都有N个方向(1——N),当取够N个数时,输出一个排列,然后退后一步,取前一个数的下一个方向(即前一个数+1),并且要保证所有数字不能重复。当前数字的所有方向都取完时,继续退一步,一直重复到第一个数为止方法二
应用剔除,列出所有的千位数,
1.剔出出现重复数字的数
2.剔出数字中出现不匹配4,5,9,8
最简单的办法是
System.out.println("4,5,9,8")
.....
写24个
[解决办法]
[code=Java][/code]
/*
* 现在有int sss [] = {4,5,8,9},写一段程序让程序输出sss这个数组的所有排序!
* 比如说4,5,8,9
*4,5,9,8
*4,9,5,8
*4,9,8,5等等所有的排序种类,总共应该是24种,这个程序应该怎么编写?谢谢
*
*/
import java.util.ArrayList;
public class Order {
/**
* 生成子序列
* 比如说a=”5“,b={(8,9),(9,8)}
* 返回的数据就是{(5,8,9),(5,9,8).......}
* 即是在b的每条记录中将a插进去
* @param a
* @param b
* @return
*/
public ArrayList<String> switchTwo(String a,ArrayList<String> b){
/*获取list的长度,后面list长度会改变,必须在前面记录下*/
int size=b.size();
/*将a插在前面*/
for(int i=0;i<size;i++){
b.add(a+","+b.get(i));
}
/*这一段代码惨不忍睹,作用将a插在中间,即是逗号后面
*
* 主要疑惑点在取得逗号的位置,我的做法是:
* 比如{5,8,9},第一个很好取,第二个则是获取该字符串的一个字串,让第二个逗号变成字串的第一个逗号
* 其实这可以写一个方法了
*
* 不知道各位还有没有其它好点方法,请多多指教
*/
for(int i=0;i<size;i++){
/*获取字符串*/
String temp=b.get(i);
/*用于记录子字符串*/
String templ=temp;
/*逗号在原字符串中的位置*/
int ipos=0;
while(templ.indexOf(",")!=-1){
ipos=ipos+templ.indexOf(",");
StringBuffer sb=new StringBuffer(temp);
/*插入语句*/
sb.insert(ipos+1, a+",");
b.add(sb.toString());
templ=new String(temp.substring(ipos+1));
/*位置的问题很烦人,建议看看API*/
ipos++;
}
}
/*将a插到后面*/
for(int i=0;i<size;i++){
b.add(b.get(i)+","+a);
}
/*移去处理的原始数据,就是传过来的list的数据*/
for(int i=0;i<size;i++){
b.remove(0);
}
return b;
}
/**
* 用的是递归方法,要取得{4,5,8,9}的排列,首先要取得{5,8,9}的排列
* @param a
* @return
*/
public ArrayList<String> getOrder(int[] a){
if(a.length==1){
ArrayList<String> list=new ArrayList<String>();
list.add(new String(a[0]+""));
return list;
}
else{
int[] b=new int[a.length-1];
for(int i=1;i<a.length;i++){
b[i-1]=a[i];
}
return switchTwo(new String(a[0]+""),getOrder(b));
}
}
public static void main(String args[]){
int[] a={4,5,8,9};
long start=System.currentTimeMillis();
ArrayList<String> list=new Order().getOrder(a);
long end=System.currentTimeMillis();
System.out.println(end-start);
for(String b:list){
System.out.println(b);
}
System.out.println(list.size());
}
}
[解决办法]
全排列问题.
[解决办法]
直接4个for循环,轻松搞定.
[解决办法]
6楼的没看懂思想
能不能解释一下
[解决办法]
int main(int argc, char* argv[])
{
unsigned char cur[4] = {'a','b','c','d'};
unsigned char * iCur = cur;
unsigned char * jCur = cur;
unsigned char * kCur = cur;
unsigned char * mCur = cur;
for( int i = 0; i<4; i++)
{
for( int j = 0; j<4; j++ )
{
for( int k=0; k<4; k++)
{
for( int m =0; m<4; m++)
if( iCur[i] == jCur[j] || kCur[k] == jCur[j] || mCur[m] == jCur[j] || iCur[i] == kCur[k] || iCur[i] == mCur[m] || kCur[k] == mCur[m])
{}
else
{
printf( "%c\t%c\t%c\t%c\t\n",iCur[i],jCur[j],kCur[k],mCur[m]);
}
}
}
}
return 0;
}
HAHA,Just a Test
[解决办法]
最容易想..4重for
[解决办法]
VC
void main(void){
int num[] = {4, 5, 8, 9};
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (j != i)
for (int k = 0; k < 4; k++)
if (k != j && k != i){
cout << num[i] << " " << num[j] << " ";
cout << num[k] << " " << num[6 - i - j - k] << endl;
}
个人感觉,递归不适合这题~~