2020届-字节跳动提前批-后台笔试编程题分享

总体来说不难,但是只做出来了2.5道。其实正常情况应该都做出来的,状态不好。前面细节处dubeg花了时间。后面时间不够慌了。随便写了点骗个分结束。(当然本篇文章都是认真写的,哈哈)
第一题:

​ 链表倒数第k个节点。

import java.util.Scanner;

public class Test2 {

	public static class ListNode {
		int val;
		ListNode next = null;
		ListNode(int x) {
			val = x;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ListNode head = new ListNode(0);
		ListNode p = head;
		for (int i = 0; i < n; ++i) {
			int x = sc.nextInt();
			p.next = new ListNode(x);
			p = p.next;
		}
		int k = sc.nextInt();
		//head = head.next;
		ListNode q = head;
		for (int i = 1; i < k-1; ++i) {
			if(q.next != null) {
				q=q.next;
			}else {
				System.out.println("null");
				return;
			}
			
		}
		ListNode r = head;
		while(q != null) {
			r=r.next;
			q=q.next;
		}
		System.out.println(r.val);
	}
}

第二题:
让n个学生排成一排。每个学生至少一个糖果。如果某个学生发现他的分数比相邻的同学分数高。但是糖果却不比他们多。(这里有个坑,我调试了好久。相等也不行,忽略了相等情况),便不开心。你需要使用最少的糖果让所有孩子开心。

import java.util.Arrays;
import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] num = new int[n];
		for(int i =0; i < n;++i) {
			num[i] = sc.nextInt();
		}
		
		int[] candy = new int[n];
		Arrays.fill(candy, 1); //每人至少一个
		for(int i=1; i<n;++i) {
			if(num[i]>num[i-1]) {
				candy[i]=candy[i-1]+1;
			}
		}
		for(int i =n-1;i >0;--i) {
			if(num[i-1] > num[i] && candy[i-1]< candy[i]) {
				candy[i-1] = candy[i]+1;
			}
		}
		int sumCount = 0;
		for(int j=0;j < n;j++) {
			sumCount +=candy[j];
		}
		  System.out.println(sumCount);
	}

}

3、马里奥

​ 马里奥通过弹跳到达终点(数组最右边+1),弹板可以向前也可以向后越过一定的距离。非弹板是悬崖(0).如果掉下去就闯关失败。出生在一个随机弹板(弹板非0)。闯关成功的评分是跳跃的次数。无法到达输出-1;

终点是右侧。非弹板非悬崖的地方,即数组越界的地方。

思路:(DFS+回溯)同一轮不能跳回去,不然会死循环

import java.util.Scanner;

public class Jump2 {
	private static int minStep = Integer.MAX_VALUE;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int P = sc.nextInt();
		int[] dist = new int[N];
		for (int i = 0; i < N; ++i) {
			dist[i] = sc.nextInt();
		}
		boolean[] visit = new boolean[N];
		int count = 1;
		dfs(dist, visit, P - 1, count);
		if (minStep == Integer.MAX_VALUE) {
			System.out.println(-1);
		} else {
			System.out.println(minStep);
		}
	}

	private static void dfs(int[] dist, boolean[] visit, int p, int count) {

		visit[p] = true;
		if (dist[p] == 0)// 死掉了
			return;
		int step = dist[p];
		int left = p - step < 0 ? 0 : p - step;
		int right = p + step;
		if (right >= dist.length) { // 说明到达终点
			if (count < minStep)
				minStep = count;
			return;
		}
		for (int i = left; i < right; ++i) {
			if (!visit[i]) {
				dfs(dist, visit, i, count + 1);
			}
		}
		visit[p] = false;// 回溯
	}
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值