解题思路

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

  1. 单个小球的路径

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

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

    • 总距离 =
    • =
    • =

代码

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

算法及复杂度

  • 算法:数学公式
  • 时间复杂度:,直接计算
  • 空间复杂度:,只使用常数额外空间