互联网笔试经典算法——机器跳跃问题(字节跳动真题)

机器人正在玩一个古老的基于DOS的游戏。游戏中有N+1座建筑——从0到N编号,从左到右排列。编号为0的建筑高度为0个单位,编号为i的建筑的高度为H(i)个单位。起初, 机器人在编号为0的建筑处。每一步,它跳到下一个(右边)建筑。假设机器人在第k个建筑,且它现在的能量值是E, 下一步它将跳到第个k+1建筑。 它将会得到或者失去正比于与H(k+1)与E之差的能量。如果 H(k+1) > E 那么机器人就失去 H(k+1) - E 的能量值,否则它将得到 E - H(k+1) 的能量值。游戏目标是到达第个N建筑,在这个过程中,能量值不能为负数个单位。现在的问题是机器人以多少能量值开始游戏,才可以保证成功完成游戏?

输入描述:

第一行输入,表示一共有 N 组数据.第二个是 N 个空格分隔的整数,H1, H2, H3, …, Hn 代表建筑物的高度

输出描述:

输出一个单独的数表示完成游戏所需的最少单位的初始能量

示例1

输入:
5
3 4 3 2 4
输出:
4

源代码:

方法一:
 import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    //输入所需要进行运算的值
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        int[] H = new int[N+1];
        H[0] = 0;
        for(int i = 1; i < N+1; i++) {
            H[i] = input.nextInt();
        }
        //关闭输入
        input.close();
        System.out.println(Solution(N, H));
    }
	//写一个进行计算的方法方法
    public static int Solution(int N, int[] H) {
        int[] E = new int[N+1];
        E[N] = 0;
        for(int i = N; i > 0; i--) {
            E[i-1] = (H[i] + E[i] + 1) / 2;
        }
        return E[0];
    }
方法二:利用递归进行计算

采用了逆向思维的方法,从后往前进行运算

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = sc.nextInt();
//        String line = br.readLine();
//        String[]h = line.split(" ");
        int[]high = new int[n+1];
        for (int i=0;i<n+1;i++){
            if (i==0){
                high[i]=0;
            }else
            high[i]=sc.nextInt();
        }

        rebot(high,0,n);
    }

    static void rebot (int[] high,int e,int i){
		//递归的出口
        if (i<1){
            System.out.println(+e);
            return;
        }
		//当出现负数的时候从头重新开始
        e=(e+high[i]+1)/2;
        if (e<0)
        rebot(high,e++,high.length-1);
        else{
            rebot(high,e,--i);
        }
//        System.out.println(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值