【Java版oj】day28反转部分单向链表、猴子分桃
目录
一、反转部分单向链表
(1)原题再现
(2)问题分析
(3)完整代码
二、猴子分桃
(1)原题再现
(2)问题分析
(3)完整代码
一、反转部分单向链表
(1)原题再现
反转部分单向链表__牛客网
给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。
输入描述:
n 表示单链表的长度。
val 表示单链表各个节点的值。
L 表示翻转区间的左端点。
R 表示翻转区间的右端点。
输出描述:
在给定的函数中返回指定链表的头指针。
示例1
输入
5
1 2 3 4 5
1 3
输出
3 2 1 4 5
(2)问题分析
这道题需要先定义一个结点类,里面包括结点存储的值和下一个指向,定义一个构造方法。因为这里输入输出全是自己写的,所以我先定义了一个数组,将输入的所有值放入数组中,先进行部分反转,然后再把每个值装入结点中,并连接起来。最后输出。
ps:其实好像直接用数组输入输出也可以,不知道这道题到底考什么。
(3)完整代码
import java.util.Scanner; /* * 反转部分单向链表 */ class Node { int val; Node next; public Node(int val) {//构造方法 super(); this.val = val; this.next = null; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int len = sc.nextInt(); int []value = new int[len]; for (int i = 0; i < len; i++) { value[i] = sc.nextInt(); } int left = sc.nextInt(); int right = sc.nextInt(); reverse( value, left-1, right-1); Node head = arrayToList(value); Node node; for (node = head; node.next != null; node = node.next) { System.out.print(node.val + " "); } System.out.print(node.val); } public static void reverse(int []value, int left, int right) { while (left < right) { int tmp = value[left]; value[left] = value[right]; value[right] = tmp; left++; right--; } } public static Node arrayToList(int []value) { Node head = new Node(-1); Node node = head; for (int i = 0; i < value.length; i++) { Node newNode = new Node(value[i]); node.next = newNode; node = newNode; } return head.next; } }
二、猴子分桃
(1)原题再现
猴子分桃__牛客网
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。输入描述:
输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤20)。
输入以0结束,该行不做处理。
输出描述:
每组测试数据对应一行输出。
包括两个整数a,b。 分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。
示例1
输入
5
1
0
输出
3121 1025
1 1
(2)问题分析
这道题是一道找规律。因为每次分5堆都会多出来1个,所以我们借4个桃子,这样每次都可以刚好分成5堆并且,每次给老猴子的桃子都不在我们借出的那4个中,这样最后减掉4就可以得到结果。假设最初由x个桃子,我们借给猴子4个,则此时有x+4个,第一个猴子得到,剩余个。第二个猴子分完后剩余个。第三个猴子分完后剩余个。依次类推,最后一个猴子分完后剩余。老猴子得到就是每次分到的1个+最后剩余的减去一开始借给他的四个得到。要满足最后剩余的为整数,并且x最小,则当 时,满足要求,老猴子最终得到。
(3)完整代码
import java.util.Scanner; /* * 猴子分桃 */ public class Main {//纯数学推导 public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); if (n == 0) { return; } long a = (long)Math.pow(5, n); long b = (long)Math.pow(4, n); System.out.println((a - 4) + " " + (b - 4 + n)); } } }