目录
1.反转部分单向链表
链接:反转部分单向链表__牛客网
来源:牛客网
[编程题]反转部分单向链表
- 热度指数:2164 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 256M,其他语言512M
给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。
输入描述:
n 表示单链表的长度。 val 表示单链表各个节点的值。 L 表示翻转区间的左端点。 R 表示翻转区间的右端点。
输出描述:
在给定的函数中返回指定链表的头指针。示例1
输入
5 1 2 3 4 5 1 3输出
3 2 1 4 5
注意1. sc.nextLine();
2.字符串反转时候
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 吃掉nextInt的换行符
sc.nextLine();
String str = sc.nextLine();
int left = sc.nextInt();
int right = sc.nextInt();
String[] arr = str.split(" ");
Node dummyHead = new Node();
Node head = dummyHead;
for (int i = 0; i < n; i++) {
Node node = new Node(Integer.parseInt(arr[i]));
head.next = node;
head = node;
}
Node newNode = reversePartList(dummyHead.next,left,right);
while (newNode != null){
System.out.print(newNode.val+" ");
newNode = newNode.next;
}
}
public static Node reversePartList(Node head, int left, int right) {
Node dummyHead = new Node();
dummyHead.next = head;
Node prev = dummyHead;
for (int i = 1; i < left; i++) {
prev = prev.next;
}
// prev指向待反转的区间前驱,cur指向待反转的第一个节点
Node cur = prev.next;
for (int i = 0; i < (right-left); i++) {
Node tmp = cur.next;
// 先把next从链表中删除
cur.next = tmp.next;
// 再将next头插cur之前
tmp.next = prev.next;
prev.next = tmp;
}
return dummyHead.next;
}
}
class Node{
int val;
Node next;
public Node(){
}
public Node(int val){
this.val = val;
}
}
2.猴子分桃
链接:猴子分桃__牛客网
来源:牛客网
[编程题]猴子分桃
- 热度指数:2412 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。输入描述:
输入包括多组测试数据。 每组测试数据包括一个整数n(1≤n≤20)。 输入以0结束,该行不做处理。
输出描述:
每组测试数据对应一行输出。 包括两个整数a,b。 分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。示例1
输入
5 1 0输出
3121 1025 1 1
开始时的总桃子数:
X = 5^n - 4
老猴子最后能得到的桃子数:n + (X+4)*(4/5)^n - 4 = n + 4^n - 4
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) break;
long a = (long) (Math.pow(5, n) - 4);
long b = (long) (Math.pow(4, n) + n - 4);
System.out.println(a + " " + b);
}
}
}