偶然在CSDN看到一個帖子,說有個某互聯網巨頭公司的筆試題目--倒水問題
題目:現有M升水,N個杯子,把水倒入杯子中,假設單個杯子足夠盛滿M升水,且杯子可以爲空,杯子之間沒有區別,求有多少種倒發。
輸入:7升水,3個杯子,得到結果8個
體現出算法基礎的薄弱了,敏思苦想了1整天。
0 0 (M減去前兩項)
0 1 (M減去前兩項)
0 2 (M減去前兩項)
0 3 (M減去前兩項)
1 0 (M減去前兩項)
1 1 (M減去前兩項)
........
大概就是這麼個情況
這裏引入一個問題就是每有一個杯子就要一次for循環,因爲是N個杯子,還不知道N是幾,這就是題目所說的不確定的N次for循環嵌套的問題
下面給代碼吧
package com;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class DaoShui
{
/**
* M 升水,N個杯子
*/
int M = 7;
int N = 3;
List<Object[]> list = new ArrayList<Object[]>();
private int[] arr = new int[N];
int result = 0;
/**
* 不特定的多次for循環嵌套
* @param j
*/
void XunHuan(int j)
{
if (j == arr.length)
{
List<Integer> values = new ArrayList<Integer>();
for (int i : arr)
{
result = result + i;
values.add(i);
}
if (result == M)
{
list.add(values.toArray());
}
result = 0;
return;
}
while (arr[j] <= M)
{
XunHuan(j + 1);
arr[j]++;
if (j + 1 < arr.length)
{
arr[j + 1] = 0;
}
}
}
/**
* 測試類
*/
@Test
public void show()
{
XunHuan(0);
List<Object[]> list2 = new ArrayList<Object[]>();
boolean flag = true;
/*
* list是取出了所有情況,但是這並不是我們想要的
* 我們要去重,即007和070和700都是相同的
* 首先我們數組排序,然後比較數組的值是否一致
*/
for (Object[] a : list)
{
Arrays.sort(a);
for (Object[] obj : list2)
{
if (Arrays.equals(obj, a))
{
flag = false;
break;
}
}
if (flag)
{
list2.add(a);
}
flag = true;
}
for (Object[] o : list2)
{
for (Object ob : o)
{
System.out.print(ob);
}
System.out.println();
}
}
}
這個可能不是最好的算法,但是暫時解決了心中疑問了
輸出結果:
007
016
025
034
115
124
133
223
一共8種