黑马程序员技术交流社区

标题: 一道入学考试题,求各位大神赐教!小弟做不出来了! [打印本页]

作者: 18353665932    时间: 2014-10-7 20:04
标题: 一道入学考试题,求各位大神赐教!小弟做不出来了!
28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)

会的大神万望赐教!

作者: Huberry    时间: 2014-10-7 21:25
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x = getBottles(28);
  6.                 int y = getBottles(50);
  7.                 System.out.println("28人:"+x+"----50人:"+y);
  8.         }

  9.         public static int getBottles(int num){ //定义一个获取瓶数的方法,接收人数
  10.                 int caps = 0; //定义一个变量记录当前瓶盖数
  11.                 int bots =0;  //定义一个变量记录当前的可乐数
  12.                 if(num<=3)
  13.                         return num;
  14.                 for(int i=num/2; i<=num; i++){  //从人数的一半开始遍历
  15.                         caps = i;
  16.                         bots = i;
  17.                         while(caps>=3){  //只要瓶盖数大于等于3就继续换
  18.                                 bots = bots+caps/3;   //可乐数= 当前可乐数 + 瓶盖换的
  19.                                 caps = caps/3+caps%3; //瓶盖数= 瓶盖换的可乐 + 换剩下的
  20.                         }
  21.                         if(bots>=num)
  22.                                 return i;
  23.                 }
  24.                 return 0;
  25.         }
  26. }
复制代码

作者: 家进    时间: 2014-10-7 22:17
实际要买的可乐 = 总人数 - 总人数/4    (不算小数)
作者: yl82846094    时间: 2014-10-7 22:18
沙发。。。。。。
作者: zz_job    时间: 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.
  1. public class Test {
  2. /*
  3. 需求:
  4.         28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  5. 思路:
  6.         一看这种题,有返回值,有尽头又不知道要循环多少次的事,除了while循环,优先想递归.
  7.         getCola(num,cola)方法中,num是人数,cola是要买的可乐数.
  8.         最开始,人数是28,可乐数是0.
  9.         因为是递归,所以要写一个方法才能实现方法调用自身.
  10.        
  11.         当:num<=3时,也就是人数小于等3时,要买的可乐瓶数等人数,因为不能用3个瓶盖换.
  12.         当:num>3时,就可以用瓶盖换.
  13.                 这时考虑==>
  14.                                 1、每3个瓶盖可以换1瓶可乐,相当于,当可乐数每+3,人数都能-4.
  15.                                 2、可乐数就等于3加上剩余人数要买的可乐数.这句话用代码表示就是
  16.                                 num = num-4;
  17.                                 cola = 3+getCola(num,cola);
  18.         将上述思路整合,即得出代码.
  19.         50人同理.
  20. */
  21.         public static void main(String[] args) {
  22.                 int num = 4;
  23.                 int cola = getCola(num, 0);
  24.                 System.out.println(num+"人要至少买"+cola+"瓶可乐");
  25.         }

  26.         private static int getCola(int num, int cola) {
  27.                 if (num <= 3) {
  28.                         cola = cola + num;
  29.                         return cola;//这一句在num大于3的时候,每次递归都会调用到.
  30.                 } else {
  31.                         cola = 3 + getCola(num-4, cola);
  32.                         return cola;//这一句return才是程序最后返回结果的那一句.
  33.                 }
  34.         }
  35. }
复制代码

作者: zz_job    时间: 2014-10-7 23:24
呃...num最开始应该是28,不是4    4是我测试时候用的..没改过来...
作者: zz_job    时间: 2014-10-7 23:27
if语句里的return的注释写得有点问题,应该说,如果把整个cola=... 这个表达式展开,if里的return应该出现在最后 的位置;else里的return返回各项相加的和,也就是最终结果。
当然  你按cola = cola+cola/4;算也行  但是这个不是计算机里的算法,是人脑的算法了
作者: 紫狼    时间: 2014-10-8 00:43
递归用的不错...
作者: hollywood2014    时间: 2014-10-8 01:45
楼主,看我用while秒杀各位大神,哈哈......
  1. package 入学测试;
  2. /*
  3. * 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,
  4. * 那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  5. */
  6. import java.util.*;
  7. public class test_02Anvanced {

  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 List<String> list=new ArrayList<String>();
  11.                 int people=28;     //在这里自定义人数
  12.                 int num=0;//瓶盖子
  13.                 int count=0;//我自己花钱买的可乐
  14.                 int extra_coca = 0;//用瓶盖子换的可乐
  15.                 while(list.size()<people)
  16.                 {
  17.                        
  18.                         list.add("coca");
  19.                        
  20.                         count++;  //只要我花钱买了可乐,可乐+1,瓶盖子+1
  21.                         num++;
  22.                         System.out.print("买第"+count+"瓶可乐!");
  23.                         if(num==3)//当瓶盖子达到三个是,集合中的可乐+1,但此时count并不+1,因为不是自己买的,是换的
  24.                         {
  25.                                 list.add("coca");
  26.                                 num=1; //因为3个瓶盖子换了一瓶可乐后,立马会有一个盖子
  27.                                 extra_coca++;
  28.                                 System.out.println("哇!用三个盖子换了一瓶可乐,一共有"+list.size()+"瓶可乐了");
  29.                         }
  30.                         System.out.println("现在手上有"+num+"个盖子!");
  31.                                
  32.                 }
  33.                 System.out.println("自己花钱买了"+count+"瓶可乐,用瓶盖子换了"+extra_coca+"瓶可乐!");
  34.         }

  35. }
复制代码




作者: zuochbd    时间: 2014-10-8 01:57
本帖最后由 caixingke 于 2014-10-8 02:05 编辑

昨天也发了这道题给我.
我一开分析呢, 是从数据结构上来分析, 这是一棵完全三叉树.
但说实话, 二叉树的东西我都忘了不少, 所以也懒得去琢磨三叉树, 所以我换了个思路.
我喜欢用递归(递归本质是一个栈), 所以简单地用以下的几行代码简单解决:
  1. public static int buyBeverageNum(int numPerson){
  2.         if (numPerson<=3){
  3.                 return numPerson;
  4.         } else {
  5.                 return 2 + buyBeverageNum(numPerson-3);
  6.         }
  7. }
复制代码

呵呵, 里头只有一个if--else--判断, 其它都没有. 代码量超少.:lol

其思路是:
如果是3个人或3个以下的人买, 那么有多少人就买多少瓶;
即使如果有3个人, 还会再奖一瓶, 但是这一瓶退不回也没人要, 这3个人仍然还是要消费3瓶.

如果是超过3个人买, 我们把人分成多个3人组;
那么最前买的那3个人, 买了3瓶, 但会奖一瓶, 他们可以把这一瓶卖给后面的人.
即, 实际上, 这3个人, 只花了2瓶的钱.
而接下来的一组, 其会向前一组买一瓶, 再向店家买两瓶, 店家会奖一瓶, 他们把这一瓶卖给后一组,
即, 这一组, 总共也只花了2瓶的钱.
这样一组一组如此进行下去, 直到最后一组.
不管最后一组有没有3个人, 总之不会超过3个人, 即, 有多少人就买多少瓶.


这是一个简单的思路. 代码还要完善下, 比如添加一些代码, 判断下参数的合法化, 比如如果参数小于0, 那抛出异常之类.



作者: 杨佳名    时间: 2014-10-8 07:34
  1. public static int coke(int peopleNumber) {
  2.     int buyCoke = 0; // 定义一个变量来存储买的可乐数
  3.     int bottle = 0; // 定义一个变量来存储已有瓶盖数

  4.     for (int i = 1; i <= peopleNumber; i++) {
  5.             if (bottle < 3) {   //当瓶盖小于3时 买的可乐和瓶盖都加1
  6.                     buyCoke++;
  7.                     bottle++;
  8.             } else {
  9.                     bottle = 1; //当瓶盖等于3时,因为兑换可乐,所以瓶盖加1
  10.             }
  11.     }
  12.     return buyCoke;
  13. }
复制代码
觉着这样比较简洁。

作者: yueyazhishang    时间: 2014-10-8 08:34
zz_job 发表于 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.

很赞   
作者: 18353665932    时间: 2014-10-8 08:43
Huberry 发表于 2014-10-7 21:25

恩恩,谢谢大神!
作者: 18353665932    时间: 2014-10-8 08:45
zz_job 发表于 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.

之前没有认真看递归,,,,谢谢!领教了!
作者: 18353665932    时间: 2014-10-8 08:47
hollywood2014 发表于 2014-10-8 01:45
楼主,看我用while秒杀各位大神,哈哈......

高手啊!哪一期的??
作者: 沙拉很好吃    时间: 2014-10-8 09:17
只写思路吗?
作者: 18353665932    时间: 2014-10-8 09:18
杨佳名 发表于 2014-10-8 07:34
觉着这样比较简洁。

谢谢版主,明白了
作者: new999    时间: 2014-10-8 10:26
caixingke 发表于 2014-10-8 01:57
昨天也发了这道题给我.
我一开分析呢, 是从数据结构上来分析, 这是一棵完全三叉树.
但说实话, 二叉树的东 ...

递归代码要简洁不少
作者: 梦里听传说    时间: 2014-10-8 11:48
public class ceshi {
        public static void main(String[] args) {
                int person = 3569;
                int i = 3;
                jisuan(person, i);
        }

        private static void jisuan(int person, int i) {

                if (person % (i + 1) == 0)
                        System.out.println(person / (i + 1) * 3);
                else
                        System.out.println(((int) person / (i + 1)) * 3 + person % (i + 1));
        }

}
作者: 梦里听传说    时间: 2014-10-8 11:52
不用递归也很简单4行代码解决,思路是:三瓶可以产生一瓶,所以把四瓶可乐看成一组,就是 人数/4 看看能否除尽, 除尽了,就用结果乘以3,就是要买的瓶数。
除不尽的话,拿商乘以3加上余数

现学现卖 4行代码解决问题
作者: 嘿~~    时间: 2014-10-8 12:48
费了一上午做出来了,私密我
作者: darkads    时间: 2014-10-8 12:58
这是一道脑筋急转弯,3个人先分两瓶可乐,有两个瓶盖,再向老板买一瓶,就有了3个瓶盖,3瓶可乐,用这3个瓶盖来支付前面多买的那瓶可乐,那么正好没有剩余
(n/3)*2 + n%3
作者: 哈达洋    时间: 2014-10-9 09:37
用笔在纸上划一划,当做一个数学题,找到规律,相信你会!
作者: 李天富    时间: 2014-10-9 16:52
这其实就像连锁反应,首先,第一个人买一瓶,喝完把盖子交给后面的人,然后反应开始了,之后每3个人只需要买两瓶就可以都喝到可乐,同时会多出来一个瓶盖,然后交给后面的人,一直反应到剩余人数不足3个,此时,剩余的人一人买一瓶就行了。于是,需要买的可乐瓶数是:1+((num-1)/3)*2+(num-1)%3.
当然之前有人发过帖子说向老板借瓶盖什么的,由于题目上没说可以借,所以就暂时不那么考虑了。
作者: chenglove1201    时间: 2014-10-9 17:10
zz_job 发表于 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.

精彩,谢谢
作者: 646245771    时间: 2014-10-9 17:39
  1. package com.itheima;

  2. * 思路:
  3. *   1、定义一个for循环,每一个人开始买可乐。
  4. *          2、因为买3瓶可乐可以兑换一瓶可乐,那么可以定义一个要买的可乐变量,如果可乐数量达到3瓶,那么这时候将可乐的数量重置为1,
  5. *                 否则的话,就将这次买可乐的次数用number变量记录下来。
  6. */
  7. public class Test10 {

  8.         public static void main(String[] args) {

  9.                 int number_1 = getNumber(28);
  10.                 System.out.println("28个人需要买:"+number_1+"瓶可乐");
  11.                
  12.                 int number_2 = getNumber(50);
  13.                 System.out.println("50个人需要买:"+number_2+"瓶可乐");
  14.         }

  15.         private static int getNumber(int persons) {
  16.                
  17.                 int cola = 0;        //要买的可口可乐
  18.                
  19.                 int number = 0;        //这是用来记录买可口可乐的次数
  20.                 for (int i = 0; i < persons; i++) {
  21.                
  22. //                        因为3瓶可乐可以兑换1瓶,所以如果可乐达到3瓶,那么将可乐数重置为1
  23.                         if (cola==3) {
  24.                                 cola = 1;
  25.                         } else {        // 否则,就将这次买可乐的次数,用number变量进行记录。
  26.                                 cola++;
  27.                                 number++;
  28.                         }       
  29.                 }
  30.                 return number;
  31.         }

  32. }
复制代码

作者: 香草芭芙    时间: 2014-10-9 17:57
好有趣的题目啊. :D
  1. public class Game
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 function(28);
  6.                 // ----------
  7.                 function(50);
  8.         }
  9.         public static void function(int p)
  10.         {
  11.                 int person = p; // 人数
  12.                 int cola = 0; // 买可乐
  13.                 int sum = 0; // 要买的可乐总数
  14.                 while (true)
  15.                 {
  16.                         if (person == 0)
  17.                         {
  18.                                 break;
  19.                         }
  20.                         else
  21.                         {
  22.                                 if (cola == 3)
  23.                                 {
  24.                                         person--;
  25.                                         cola = 1;// 换可乐又得一瓶盖.
  26.                                 }
  27.                                 else
  28.                                 {
  29.                                         cola++;
  30.                                         person--;
  31.                                         sum++;
  32.                                 }
  33.                         }
  34.                 }
  35.                 System.out.println(sum);
  36.         }
  37. }
复制代码

作者: x564573138    时间: 2014-10-9 18:02
沙发。,。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2