日期:2014-05-20  浏览次数:20753 次

李开复给面试者出的一道题
有1000个苹果,10个箱子 怎么个放法,不管我想拿多少个苹果,都能成箱成箱地拿?
用具体的算法怎么实现?[Java]

------解决方案--------------------
第一个箱子放2的0次方,第2个放2的1次方 ....依此类推第10个放2的9次方,然后将你要去的数转为2进制数 看2进制数第几个位置上的数是1就搬第几个箱子
------解决方案--------------------
2^10=1024吧?

如果说1023个苹果,放10个箱子,想拿多少都成箱拿,
这个好算吧:
512,256,128,64,32,16,8,4,2,1

那么,从最大的箱子中去掉23个,是不是就是答案?

489,256,128,64,32,16,8,4,2,1
------解决方案--------------------
前九个箱子依次放2的n次方个(n是从0到8的整数),最后一个箱子放剩下的489个。
为什么这么放,不太清楚,应该可以证明这些数字可以表达从1~1000之间的任何数。
等待高人出现解决这一步。
至于知道为什么这么放之后,怎么取箱子就容易多了。
import java.util.ArrayList;
import java.util.Scanner;


public class Test00 {

/**
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
Integer i = Integer.valueOf(string);
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(4);
list.add(8);
list.add(16);
list.add(32);
list.add(64);
list.add(128);
list.add(256);
list.add(489);
if(i>1000||i<=0)
{
System.out.println("can't express!");
System.exit(0);
}
String str = getArrayString(i,list);
System.out.println(str);

}
public static String getArrayString(int i,ArrayList<Integer> a)
{
String value="";
int j=0;
for(;j<a.size();j++)
{
if(a.get(j)>i)
break;
else if(a.get(j)==i)
return ""+a.get(j)+"";
}
value = a.get(j-1)+"+";
i = i - a.get(j-1);
int m = j;
if(m==a.size())
a.remove(m-1);
else
{
for(;m<a.size();m++)
a.remove(m);
}
return value+getArrayString(i,a);
}

}

------解决方案--------------------
完美答案最终版
import java.util.*;
import java.io.*;
public class Apple 
{

public static void main(String[] args) throws Exception
{
//定义一个用户最后要拿的箱子集合
ArrayList<Integer> boxfinal=new ArrayList<Integer>();

//定义一个箱子集合,初始化
ArrayList<Integer> box=new ArrayList<Integer>();
for (int i=0;i<10;i++)
{
//Math.pow()的返回值是double类型,需要转换
box.add((Integer)(int)Math.pow(2, i));
}
System.out.println("10个苹果箱子:"+box);


//输入你想拿的苹果数appleNumber
System.out.println("您要拿多少个苹果?请输入,1000范围内,不然输出结果不正确,我懒得写控制了:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
int appleNumber=0;
try{
if ((str=br.readLine())!=null)
{
appleNumber=Integer.parseInt(str);
}
}
catch (IOException e)
{
System.out.println("您输入不正确,请重新输入");
}

//通过这个循环实现数据的拆分,很简单的
for (int i=9;i>=0;i--)
{
if(appleNumber>box.get(i))
{
boxfinal.add(box.get(i));
appleNumber-=box.get(i);
}
}
System.out.println("您需要拿走的箱子为:"+boxfinal);



}
}
------解决方案--------------------
其实这个也很好想,10位二进制可以表示1023,即为1111111111.你可以吧这十个二进制位想象成10个箱子,无论你要那一个小于等于1000数,10位都是足够表示的,例如521相应的表示为1000000101 就可以想象成前第一个和第三个还有第十个装1 ,8 , 512 这是李开复在微软时做客电视台面试清华大学生和北京大学生的一道题目。
------解决方案--------------------
这样的题目并不难