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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊爱吃软糖吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值