> 文章列表 > 【Java版oj】day28反转部分单向链表、猴子分桃

【Java版oj】day28反转部分单向链表、猴子分桃

【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个,第一个猴子得到\\frac{\\left ( x+4 \\right )}{5},剩余\\frac{4\\left ( x+4 \\right )}{5}个。第二个猴子分完后剩余\\frac{4^{2}\\left ( x+4 \\right )}{5^{2}}个。第三个猴子分完后剩余\\frac{4^{3}\\left ( x+4 \\right )}{5^{3}个。依次类推,最后一个猴子分完后剩余\\frac{4^{n}\\left ( x+4 \\right )}{5^{n}。老猴子得到就是每次分到的1个+最后剩余的减去一开始借给他的四个得到n-4+\\frac{4^{n}\\left ( x+4 \\right )}{5^{n}。要满足最后剩余的为整数,并且x最小,则当 x+4=5^{n}时,满足要求,老猴子最终得到n-4+4^{n}

(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));}}
}