总体来说不难,但是只做出来了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;// 回溯
}
}