V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fallinlovewith
V2EX  ›  求职

求职遇到一个问题

  •  
  •   fallinlovewith · 2020-05-20 15:11:53 +08:00 · 3203 次点击
    这是一个创建于 1408 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Boss 直聘上沟通,对方回复

        您好,可能受疫情影响,此岗位求职的人实在太多了,很难挨个面试。本着公平的原则,请允许我先出一个题,能答上的再继续沟通,可以吗?题目如下:
       1 块钱可以买 3 个桃子吃,吃完后 3 个桃核可以换 1 个桃子,请问 135142857 元可以最多吃到多少个桃子。
    

    起初用笔算了下以为 4*n,回复不对,然后 IDEA 敲下,如:

    public int solution(int money) {
            // money 必须>0
            // money 不能超过 Integer.MAX_VALUE
            int sum = 0;
            // 买桃子数
            int peaches = money * 3;
            
            // 核数
            int peachCore = peaches;
            int exchange = 0;
            // 核处理
            while (peachCore / 3 >= 1) { // 说明换到了至少 1 个桃子
                // 换桃子
                int changPeaches = peachCore / 3;
                exchange += changPeaches;
                peachCore = changPeaches;
            }
            
            sum = peaches + exchange;
            
            return sum;
        }
    

    带入结果是: 135142857 元可以吃到608142849个 bitch

    再问对方,回复说: 差一点点

    我: 对不起,打扰了

    我想问下各位 V 友是这样算吗?(不想百度,算不出来,感觉不合适这行业)

    不对的话,明天我就去送外卖去了....... :dog:

    第 1 条附言  ·  2020-05-20 17:28:34 +08:00
    看到这么多人回复,非常感谢,感觉自己好丢人,太菜了,谢谢你们,再见!
    27 条回复    2020-05-20 19:51:02 +08:00
    chaleaoch
        1
    chaleaoch  
       2020-05-20 15:34:17 +08:00
    你没考虑不能整除的情况啊.
    pwrliang
        2
    pwrliang  
       2020-05-20 15:37:34 +08:00
    private int get(int money) {
    int cores = 0;
    int ans = 0;
    while (money > 0 || cores >= 3) {
    if (money > 0) {
    ans += 3;
    money--;
    cores += 3;
    } else {
    ans += cores / 3;
    cores = cores % 3 + cores / 3;
    }
    }
    return ans;
    }

    因为桃核桃子换完了,还可以继续用来换桃子,所以你那个 while 逻辑不对的。我的答案是 608142856
    kop1989
        3
    kop1989  
       2020-05-20 15:37:35 +08:00
    int changPeaches = peachCore / 3; 你这样做岂不是每次循环都会抛弃掉余数么
    wroyal
        4
    wroyal  
       2020-05-20 15:38:00 +08:00
    非程序员,算出来 608142856
    zqz19941106
        5
    zqz19941106  
       2020-05-20 15:39:00 +08:00
    之前看到的智力题 是不是有剩下 2 个 可以借一个吃完有 3 个还回一个= -
    zeroking
        6
    zeroking  
       2020-05-20 15:45:14 +08:00
    少吃了 7 个,608142856
    rabbbit
        7
    rabbbit  
       2020-05-20 15:46:33 +08:00
    function s(money) {
      let peachNum = money * 3;
      let coreNum = 0;
      let eatNum = 0;
      while (peachNum) {
       coreNum += peachNum;
       eatNum += peachNum;
     
       peachNum = 0;
       if (coreNum >= 3) {
        peachNum = Math.floor(coreNum / 3);
        coreNum = coreNum % 3;
      }
     }
      return eatNum;
    }

    console.log(s(135142857)); // 608142856
    wangkai0351
        8
    wangkai0351  
       2020-05-20 15:49:31 +08:00
    可能老哥欠缺一些解算法题的套路,一旦面试中问最优情况,我首先条件反射想到贪心和动态规划。
    resist
        9
    resist  
       2020-05-20 15:54:13 +08:00
    虽然知道怎么搞,但懒得算,哈哈哈
    vessel
        10
    vessel  
       2020-05-20 15:55:37 +08:00
    int peachs(int peach, int he) {
    if (he > 0) {
    peach += he / 3;
    he %= 3;
    }

    if (he < 3 && peach == 0) {
    return 0;
    }

    int n_he = peach + he;
    return peach + peachs(0, n_he);
    }


    int main() {

    cout << peachs(135142857*3, 0);
    return 0;

    }
    本轮没兑换完的核,可以下轮一起兑换。
    写成递归比较好理解。
    wroyal
        11
    wroyal  
       2020-05-20 16:08:32 +08:00
    Vegetable
        12
    Vegetable  
       2020-05-20 16:11:38 +08:00   ❤️ 1
    最简单的思路.能换马上换,不能换再花钱.全程加减法.慢是慢点
    def peach(n):

    core = 0
    p = 0
    while n:
    if core >= 3:
    core -= 2
    p += 1
    continue
    n -= 1
    core += 3
    p += 3
    while core >= 3:
    core -= 2
    p += 1
    return p
    print(peach(135142857)) # 608142856
    wutiantong
        13
    wutiantong  
       2020-05-20 16:17:18 +08:00
    数字改小点就是个小学奥数题了。
    wutiantong
        14
    wutiantong  
       2020-05-20 16:18:04 +08:00
    其实这根本就不是个需要编程运算的问题。
    xiaoxinshiwo
        15
    xiaoxinshiwo  
       2020-05-20 16:21:28 +08:00
    peach 🍑
    bitch
    dinjufen
        16
    dinjufen  
       2020-05-20 16:23:08 +08:00
    const money = 135142857
    let sum = 0
    let he = 0
    let taozi = money * 3
    while (he >= 3 || taozi > 0) {
    sum = sum + taozi
    he = taozi + he
    taozi = Math.floor(he / 3)
    he = he % 3
    }
    console.log(sum)
    luban
        17
    luban  
       2020-05-20 16:27:29 +08:00
    这个原型应该是酒瓶换酒的,需要确定的是最后桃核不够时是否可以借
    假设桃肉价值 x 元,桃核价值 y 元
    3*( x+y )=1,3*y = x+y ;
    可以算出 x,y 的价值,再用总价除以 x 的值
    Vegetable
        18
    Vegetable  
       2020-05-20 16:31:27 +08:00
    假设不可以借,那最后至少余下一个桃核.整除的时候需要-1
    goat
        19
    goat  
       2020-05-20 16:34:21 +08:00   ❤️ 5
    不就是二元一次方程组吗?

    一元钱买三个桃子:
    一元钱 = 3 * (桃肉 + 桃核)

    三个桃核换一个桃子:
    3 * 桃核 = 1 * (桃肉 + 桃核)
    桃核 = 0.5 桃肉
    代入第一个等式,一元钱=4.5 桃肉

    135142857 * 4.5 = 608,142,856.5 小数点后舍去
    zmxnv123
        20
    zmxnv123  
       2020-05-20 16:49:44 +08:00
    peachCore = changPeaches + peachCore % 3
    cnmllll
        21
    cnmllll  
       2020-05-20 16:59:21 +08:00
    # -*- coding: UTF-8 -*-
    money = 135142857

    #初始换到的桃子个数
    peaches = 3 * money

    #初始核桃的总个数
    hetao = peaches

    while hetao >= 3:
    #核桃能换到的桃子个数
    tmp = hetao // 3
    #每次剩余的核桃个数
    res = hetao % 3
    #换到的桃子个数+剩余的桃子个数,下次兑换
    hetao = tmp + res
    #桃子总个数累积
    peaches += tmp

    print(peaches)
    bluefalconjun
        22
    bluefalconjun  
       2020-05-20 17:02:22 +08:00
    @goat 这个思路最好...
    cnmllll
        23
    cnmllll  
       2020-05-20 17:07:02 +08:00
    Marstin
        24
    Marstin  
       2020-05-20 17:09:18 +08:00
    608 142 856
    这不是小时候做的奥赛题嘛(135142857-1)/2*9+4
    everydiao
        25
    everydiao  
       2020-05-20 17:37:55 +08:00
    我面试其他的都还行,源码我也能大致的掰一掰,但是一设计程序题,我就要 go dead,简单的冒泡和快排还行,一旦这种长篇大论,钉钉卯卯我就等死了
    lordofhollows
        26
    lordofhollows  
       2020-05-20 18:05:48 +08:00
    function alg(n) {
    res = 0 // 吃到的桃子
    x = n * 3 // 桃子数
    y = 0 // 桃核数
    while (x > 0 || y >= 3) {
    res += x // 全吃掉
    y += x // 扔桃核
    x = Math.floor(y / 3) // 换桃子
    y = y % 3 // 剩下的桃核
    }
    return res
    }

    alg(135142857) === 608142856
    teaaa
        27
    teaaa  
       2020-05-20 19:51:02 +08:00
    这题我会,PHPer 假装加班来写一写,首先 桃子 = 桃核 这不一回事儿嘛。

    $p_sum = 0; //拥有过的桃子计数
    $p_now = 3 * 135142857; //当前拥有桃子数
    $p_new = 3 * 135142857; //新换得的桃子数
    $p_else = 0; //换完剩余的桃子数(余数)

    //拥有 3 个以上桃子就跑去换:)
    while($p_now >= 3){
    $p_sum = $p_sum + $p_new; //拥有过的桃子数累加记在小本本上

    $p_now = $p_new + $p_else; //抱着当前拥有的一坨桃子
    $p_new = intval(floor($p_now / 3)); //跑去换来的新桃子
    $p_else = $p_now%3; //剩下的旧桃子(余数)
    }

    dd($p_sum); //小本本最终结果 608142856


    我好闲。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3240 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:21 · PVG 22:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.