求职遇到一个问题

2020-05-20 15:11:53 +08:00
 fallinlovewith

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:

3239 次点击
所在节点    求职
27 条回复
chaleaoch
2020-05-20 15:34:17 +08:00
你没考虑不能整除的情况啊.
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
2020-05-20 15:37:35 +08:00
int changPeaches = peachCore / 3; 你这样做岂不是每次循环都会抛弃掉余数么
wroyal
2020-05-20 15:38:00 +08:00
非程序员,算出来 608142856
zqz19941106
2020-05-20 15:39:00 +08:00
之前看到的智力题 是不是有剩下 2 个 可以借一个吃完有 3 个还回一个= -
zeroking
2020-05-20 15:45:14 +08:00
少吃了 7 个,608142856
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
2020-05-20 15:49:31 +08:00
可能老哥欠缺一些解算法题的套路,一旦面试中问最优情况,我首先条件反射想到贪心和动态规划。
resist
2020-05-20 15:54:13 +08:00
虽然知道怎么搞,但懒得算,哈哈哈
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
2020-05-20 16:08:32 +08:00
Vegetable
2020-05-20 16:11:38 +08:00
最简单的思路.能换马上换,不能换再花钱.全程加减法.慢是慢点
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
2020-05-20 16:17:18 +08:00
数字改小点就是个小学奥数题了。
wutiantong
2020-05-20 16:18:04 +08:00
其实这根本就不是个需要编程运算的问题。
xiaoxinshiwo
2020-05-20 16:21:28 +08:00
peach 🍑
bitch
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
2020-05-20 16:27:29 +08:00
这个原型应该是酒瓶换酒的,需要确定的是最后桃核不够时是否可以借
假设桃肉价值 x 元,桃核价值 y 元
3*( x+y )=1,3*y = x+y ;
可以算出 x,y 的价值,再用总价除以 x 的值
Vegetable
2020-05-20 16:31:27 +08:00
假设不可以借,那最后至少余下一个桃核.整除的时候需要-1
goat
2020-05-20 16:34:21 +08:00
不就是二元一次方程组吗?

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

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

135142857 * 4.5 = 608,142,856.5 小数点后舍去
zmxnv123
2020-05-20 16:49:44 +08:00
peachCore = changPeaches + peachCore % 3

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/673648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX