JAVA算法面试题:哪位高人会做?
发布网友
发布时间:2022-04-26 02:17
我来回答
共4个回答
热心网友
时间:2022-04-09 22:04
参考一下,稍微改改就可以了。
import java.util.ArrayList;
import java.util.List;
/**
* @author ww
*
*/
public class Combination {
/**
* @param args
*/
public static void main(String[] args) {
Combination c = new Combination();
c.printAnyThree();
}
public void printAnyThree(){
int[] num = new int[]{1,2,3,4,5,6,7,8,9};
print(combine(num,6));
System.out.println(combine(num,6).size());
}
/**
* 从n个数字中选择m个数字
* @param a
* @param m
* @return
*/
public List combine(int[] a,int m){
int n = a.length;
List result = new ArrayList();
int[] bs = new int[n];
for(int i=0;i<n;i++){
bs[i]=0;
}
//初始化
for(int i=0;i<m;i++){
bs[i]=1;
}
boolean flag = true;
boolean tempFlag = false;
int pos = 0;
int sum = 0;
//首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
do{
sum = 0;
pos = 0;
tempFlag = true;
result.add(print(bs,a,m));
for(int i=0;i<n-1;i++){
if(bs[i]==1 && bs[i+1]==0 ){
bs[i]=0;
bs[i+1]=1;
pos = i;
break;
}
}
//将左边的1全部移动到数组的最左边
for(int i=0;i<pos;i++){
if(bs[i]==1){
sum++;
}
}
for(int i=0;i<pos;i++){
if(i<sum){
bs[i]=1;
}else{
bs[i]=0;
}
}
//检查是否所有的1都移动到了最右边
for(int i= n-m;i<n;i++){
if(bs[i]==0){
tempFlag = false;
break;
}
}
if(tempFlag==false){
flag = true;
}else{
flag = false;
}
}while(flag);
result.add(print(bs,a,m));
return result;
}
private int[] print(int[] bs,int[] a,int m){
int[] result = new int[m];
int pos= 0;
for(int i=0;i<bs.length;i++){
if(bs[i]==1){
result[pos]=a[i];
pos++;
}
}
return result ;
}
private void print(List l){
for(int i=0;i<l.size();i++){
int[] a = (int[])l.get(i);
for(int j=0;j<a.length;j++){
System.out.print(a[j]+"\t");
}
System.out.println();
}
}
}
热心网友
时间:2022-04-09 23:22
就把算法给你写一下:
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
for(int k = 1;k<=n;k++)
{
if(i==j || i==k || j==k)
continue;
else
System.out.println(i*100+j*10+k);
}
热心网友
时间:2022-04-10 00:57
import java.util.*;
public class FullSort {
public void printAll(List<Integer> candidate, String prefix, int length){
if(prefix.length() == length){
System.out.print (prefix+" ");
}
for(int i=0; i<candidate.size(); i++){
List<Integer> temp = new LinkedList<Integer>(candidate);
String str = prefix+temp.remove(i);
printAll(temp, str, length);
}
}
public static void main(String[] args)
{
ArrayList<Integer> arr= new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner scn=new Scanner(System.in);
System.out.println("请输入一个1~10之间的整数");
int s=scn.nextInt();
for(int i=1;i<=s;i++)
arr.add(i);
for (int i=0; i<arr.size(); i++){
list.add(arr.get(i));
}
FullSort test = new FullSort();
System.out.println("1~"+s+"的全排列如下:");
test.printAll(list, "", list.size());
}
}
热心网友
时间:2022-04-10 02:48
不算简单,主要考你排列,并且是不重复的排列,我原来有个重复排列的类,改了下给你看看。 代码如下:
(n的值你自己给,另外其实你这里这个比较简单,完全可以用数组而不用list。)
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String args[]){
int n=4;
int count=0;
List chars=new ArrayList();
for(int i=0;i<n;i++){
chars.add(i+1+"");
}
combination(new StringBuffer(""),n,chars);
}
public static void combination(StringBuffer str,int length,List chars) {
if (length == 1){
for(int i=0;i<chars.size();i++){
StringBuffer result = new StringBuffer(str);
if(result.indexOf(chars.get(i)+"")<0){
result.append(chars.get(i));
System.out.println(". " +result);
}
}
}
if (length > 1) {
for(int i=0;i<chars.size();i++){
StringBuffer temp = new StringBuffer(str);
if(temp.indexOf(chars.get(i)+"")<0){
combination(temp.append(chars.get(i)),length-1,chars);
}
}
}
}
}