校招算法笔面试 | 校招笔面试真题-抛小球

题目

题目链接

解题思路

这是一个等比数列求和问题。关键点:

  1. 单个小球的路径

    • 下落: N N N
    • 反弹: N / 2 N/2 N/2
    • 下落: N / 2 N/2 N/2
    • 反弹: N / 4 N/4 N/4
    • 下落: N / 4 N/4 N/4
    • …直到不再反弹
  2. 等比数列

    • 每次反弹高度是前一次的 1 / 2 1/2 1/2
    • 每个高度都要算两次(上升和下降)
    • 第一次下落只算一次
  3. 求和公式

    • 总距离 = N + 2 ∗ ( N / 2 + N / 4 + N / 8 + . . . ) N + 2 * (N/2 + N/4 + N/8 + ...) N+2(N/2+N/4+N/8+...)
    • = N + N ∗ ( 1 + 1 / 2 + 1 / 4 + . . . ) N + N * (1 + 1/2 + 1/4 + ...) N+N(1+1/2+1/4+...)
    • = 3 N 3N 3N

代码

class Balls {
public:
    int calcDistance(int A, int B, int C, int D) {
        return calcSingleBall(A) + calcSingleBall(B) + 
               calcSingleBall(C) + calcSingleBall(D);
    }
    
private:
    int calcSingleBall(int height) {
        return height * 3;
    }
};
import java.util.*;

public class Balls {
    public int calcDistance(int A, int B, int C, int D) {
        // write code here
        return calcSingleBall(A) + calcSingleBall(B) + 
               calcSingleBall(C) + calcSingleBall(D);
    }
    
    private int calcSingleBall(int height) {
        return height * 3;
    }
}
# -*- coding:utf-8 -*-

class Balls:
    def calcDistance(self, A, B, C, D):
        return self.calcSingleBall(A) + self.calcSingleBall(B) + \
               self.calcSingleBall(C) + self.calcSingleBall(D)
    
    def calcSingleBall(self, height):
        return height * 3

算法及复杂度

  • 算法:数学公式
  • 时间复杂度: O ( 1 ) \mathcal{O(1)} O(1),直接计算
  • 空间复杂度: O ( 1 ) \mathcal{O(1)} O(1),只使用常数额外空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值