Java && C#

要学得东西很多,但我们的时间却不是很多!
数据加载中……
Java经典算法集

算法程序题:

    该公司笔试题就1个,要求在10分钟内作完。

    题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。



static int[] bits = new int[] { 1, 2, 3, 4, 5 };

/**
 * @param args
 */
public static void main(String[] args) {
sort("", bits);
}

private static void sort(String prefix, int[] a) {
if (a.length == 1) {
System.out.println(prefix + a[0]);
}

for (int i = 0; i < a.length; i++) {
sort(prefix + a[i], copy(a, i));
}
}

private static int[] copy(int[] a,int index){
int[] b = new int[a.length-1];
System.arraycopy(a, 0, b, 0, index);
System.arraycopy(a, index+1, b, index, a.length-index-1);
return b;
}


**********************************************************************

  基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
  1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
  2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
  3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。

采用二维数组定义图结构,最后的代码是:

import java.util.Iterator;
import java.util.TreeSet;

public class TestQuestion {

private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();

public static void main(String[] args) {
new TestQuestion().start();
}

private void start() {

// Initial the map a[][]
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
    a[i][j] = 1;
}
}
}

// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;

// Begin to depth search.
for (int i = 0; i < n; i++) {
    this.depthFirstSearch(i);
}

// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}

private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}

// restore the result value and visited value after listing a node.
    result = result.substring(0, result.length() -1);
    visited[startIndex] = false;
}
}

 

posted on 2007-03-04 14:17 Bill111 阅读(21333) 评论(21)  编辑  收藏

评论

# re: Java经典算法集 2007-03-25 08:27 圆规

大家好好看看吧!加油哦!
  回复  更多评论    

# re: Java经典算法集 2008-09-06 10:45 123

好啊好啊
  回复  更多评论    

# re: Java经典算法集 2008-10-22 20:11 cc-yuechuzhao

我的算法,不用任何数据结构
public class choose6 {
public static void main(String[] args) {
int t=0;
int x;
for (x = 122345; x < 543222; x++) {
if ((x + "").indexOf('2') >= 0) {
if ((x + "").indexOf('2', (x + "").indexOf('2')) >= 0) {
if (((x + "").indexOf('3') >= 0)
&& ((x + "").indexOf('4') >= 0)
&& ((x + "").indexOf('5') >= 0)
&&((x + "").indexOf("35")<0)
&&((x + "").indexOf("53")<0)
&&((x + "").indexOf('4')!=2)
)
++t;
System.out.println(x);
}
}
}System.out.println(t);
}
}
  回复  更多评论    

# re: Java经典算法集 2009-11-10 15:10 感应

@cc-yuechuzhao
错的
  回复  更多评论    

# re: Java经典算法集 2010-07-02 15:01 tt

public static void main(String[] args) {
for(int i=111111;i<555555;i++){
String str=i+"";
if(str.indexOf("35")==-1 && str.indexOf("53")==-1){

if(!str.substring(2).startsWith("4")){
System.out.println(str);
}
}
}


}
  回复  更多评论    

# re: Java经典算法集[未登录] 2012-07-25 14:15 过客

冒泡排序
  回复  更多评论    

# re: Java经典算法集 2013-01-22 06:18 Zi由的天空

@感应
怎么错了
  回复  更多评论    

# re: Java经典算法集 2013-03-01 15:10 adual

我来猥琐一把:
for (int i = 122345; i < 543222; i++) {
String sb = String.valueOf(i);
String temp = sb.replaceFirst("1", "a");
temp = temp.replaceFirst("2", "a");
temp = temp.replaceFirst("2", "a");
temp = temp.replaceFirst("3", "a");
temp = temp.replaceFirst("4", "a");
temp = temp.replaceFirst("5", "a");
//数字的构成必须用指定的6位数
if (! "aaaaaa".equalsIgnoreCase(temp)) {
continue;
}
/*如果4在第三位则不计此数*/
if (sb.indexOf("4") ==2) {
continue;
}
/*判断3和5不能在一起*/
int flag = 0;
if (sb.indexOf("35") > -1 || sb.indexOf("53") > -1) {
flag ++;
}
if (flag > 0) {
continue;
}

System.out.println(i);
}
}
  回复  更多评论    

# re: Java经典算法集 2013-03-09 01:37 酷到你尖叫

@adual 强!!
  回复  更多评论    

# re: Java经典算法集 2013-05-14 17:59 wu0103356

import java.util.Iterator;
import java.util.TreeSet;

public class 我的排序 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = { 1, 2, 2, 3, 4, 5 };
TreeSet<String> set = new TreeSet<String>();
for (int i = 0; i < 6; i++) {
for (int k = 0; k < 6; k++) {
for (int l = 0; l < 6; l++) {
for (int m = 0; m < 6; m++) {
for (int n = 0; n < 6; n++) {
for (int o = 0; o < 6; o++) {
if (l == 4 || i == k || i == l || i == m
|| i == n || i == o || k == l || k == m
|| k == n || k == o || l == m || l == n
|| l == o || m == n || m == o || n == o) {
continue;
}
String s = a[i] + "" + a[k] + "" + a[l] + ""
+ a[m] + "" + a[n] + "" + a[o];
if(s.contains("35")||s.contains("53")){
continue;
}
set.add(s);
}
}
}
}
}
}
Iterator i = set.iterator();
while (i.hasNext())
System.out.println(i.next());
System.out.println(set.size());
}

}
  回复  更多评论    

# re: Java经典算法集 2013-06-09 11:22 番茄炒蛋

@wu0103356
这个排序太凶残了,这么多排序。辛亏数组长度不长啊。
  回复  更多评论    

# re: Java经典算法集 2013-07-29 15:26 好球哥哥

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

//递归传入字符数组,输出有多少组合
public class 排列组合 {
public static void main(String arg[]) throws Exception {
char[] c = new char[] {'1','2','2','3','4','5'};// 定义一个做实验的数组

List<char[]> l = new 排列组合().dg(c);// 计算出所有组合

Set<String> set = new HashSet<String>();//开始去掉重复
for (char[] ctemp : l) {
String s = new String(ctemp);
if(s.charAt(2)=='4'){
continue;
}
if(s.indexOf("35")>=0){
continue;
}
if(s.indexOf("53")>=0){
continue;
}
set.add(s);
}

for(String s:set){//输出
System.out.println(s);
}

}

//递归排序方法
public List<char[]> dg(char[] targetArray) {
if (targetArray.length == 2) {// 如果数组只有2个就不用递归了,直接输出顺序
List<char[]> list2 = new ArrayList<char[]>();
list2.add(new char[] { targetArray[0], targetArray[1] });
list2.add(new char[] { targetArray[1], targetArray[0] });
return list2;
}

List<char[]> returnList = new ArrayList<char[]>();//定义要返回的结果list
for (Integer i = 0; i < targetArray.length; i++) {
char temp = targetArray[i];
char[] result = new char[targetArray.length - 1];
for (Integer j = 0; j < targetArray.length; j++) {
if (j < i) {
result[j] = targetArray[j];
} else if (j > i) {
result[j-1] = targetArray[j];
}
}
List<char[]> listaaa = charJiaList(temp, dg(result));
for (char[] c1111 : listaaa) {
returnList.add(c1111);
}

}
return returnList;
}

//dg方法的辅助方法
private List<char[]> charJiaList(char c, List<char[]> listchar) {
List<char[]> listC = new ArrayList<char[]>();
for (char[] charTemp : listchar) {
char[] charTemp1 = new char[charTemp.length + 1];
charTemp1[0] = c;
for (Integer i = 1; i < charTemp1.length; i++) {
charTemp1[i] = charTemp[i - 1];
}
listC.add(charTemp1);
}
return listC;
}
}
  回复  更多评论    

# re: Java经典算法集[未登录] 2013-09-26 02:13 john

你改一下,把数字组合换成字母或者字符,难度就出来了,这样下面的山寨将全部打倒,不过还是有可以不用数据结构的简单方法,大家有兴趣可以再来切磋下,呵呵
  回复  更多评论    

# re: Java经典算法集[未登录] 2013-09-26 02:15 john

@wu0103356
这个笨办法,有点搞笑,太没技术含量了
  回复  更多评论    

# re: Java经典算法集[未登录] 2013-09-26 02:16 john

@adual
你这个山寨了,如果换成其他字符,你就没办法,哈哈
  回复  更多评论    

# re: Java经典算法集[未登录] 2013-09-26 02:19 john

@john
哦,我仔细看了下,好像错了
  回复  更多评论    

# re: Java经典算法集 2013-10-17 17:10 迷迷

public static void main(String[] args) {
int[] bits = new int[] { 6, 7, 8, 9, 0 };
for (int i = 122345; i <= 543221; i++) {
boolean b = false;
for (int j = 0; j < bits.length; j++) {

if (("" + i).indexOf("" + bits[j]) >= 0) {
b = true;
break;
}
}
if (b == false) {
if (("" + i).substring(2, 3).equals("4") == false) {
if (("" + i).indexOf("35") == -1) {
System.out.println(i);
}
}
}
}

}
  回复  更多评论    

# re: Java经典算法集[未登录] 2013-11-21 01:28 titan

public class SoftTest {
public static void main(String[] args)
{
for(int i=122345; i<=543221 ;i++ )
{
String s = String.valueOf(i);
if(s.indexOf("2")>=0&&s.indexOf("3")>=0&&s.indexOf("4")>=0&&s.indexOf("5")>=0&& s.indexOf("4")!=2&&s.indexOf("1")>=0&&s.indexOf("35")==-1&&s.indexOf("53")==-1&&s.indexOf("2",s.indexOf("2")+1)>=0)
{
System.out.println(i);
}

}
}
}
  回复  更多评论    

# re: Java经典算法集 2014-04-17 20:09 大额_skylar

@迷迷
错了...有重复的数字,不能算是不同的排列,数字排列一个数字不能出现两次
  回复  更多评论    

# re: Java经典算法集 2014-04-24 20:11 scdxcc

public class Test {
public static void main(String[] args) {
for (int i = 122345; i <= 543221; i++) {
String s = String.valueOf(i);
if ((s.charAt(2) != '4')
&& (Math.abs(s.indexOf("3") - s.indexOf("5")) > 1)
&& (s.indexOf("0") == -1) && (s.indexOf("6") == -1)
&& (s.indexOf("7") == -1) && (s.indexOf("8") == -1)
&& (s.indexOf("9") == -1) && find(s, '1') == 1
&& find(s, '2') == 2 && find(s, '3') == 1
&& find(s, '4') == 1 && find(s, '5') == 1) {
System.out.println(i);
}

}
}

public static int find(String s, char d) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == d) {
count++;

}

}

return count;
}
}
  回复  更多评论    

# re: Java经典算法集[未登录] 2014-06-24 16:45 牛牛

@大额_skylar
package niuce.common.arith;

public class PlusSort {

public static void main(String[] args) {
getAllSerizes(new int[]{2,4,8,2,6});
}

public static int[] bubleSort(int[] nums){
int temp=0;
for(int i=nums.length-1;i>0;i--){
for(int j=0;j<i;++j){
if(nums[j+1]<nums[j]){
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}

public static void getAllSerizes(int[] nums){
int[] zn=bubleSort(nums);
String minNum="";
String maxNum="";
String flag="";
for(int i=0;i<zn.length;i++){
minNum+=zn[i];
maxNum+=zn[zn.length-i-1];
flag+="a";
}
int inMin=Integer.parseInt(minNum);
int inMax=Integer.parseInt(maxNum);
for(int i=inMin;i<=inMax;i++){
String temp=Integer.toString(i);
for(int j=0;j<zn.length;j++){
temp=temp.replaceFirst(Integer.toString(zn[j]),"a");
}
if(flag.equalsIgnoreCase(temp)){
System.out.println(i);
}
}
}
}
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: