目录
①反转部分单向链表
import java.util.*;
public class demo1 {
//首先通过内部类定义链表的节点
static class Node{
int val;
Node next;
public Node(int val){
this.val=val;
}
}
public static void main(String[] args) {
//链表的每个节点的值在一行输入结束了,每个节点的
//值用空格分隔。就需要使用nextline一次读取一行的输入
//得到一个节点值的字符串"1 2 3 4 5"
Scanner scanner=new Scanner(System.in);
//获取当前链表的节点个数
int n=scanner.nextInt();
//从nextInt获取一个节点值后,使用回车键结束本次输入,\n就会被
//nextLine方法所捕获
//因而通过nextLine吃掉nextInt的换行符
scanner.nextLine();
//“1 2 3 4 5”
String nodevalue=scanner.nextLine();
String[] nodes=nodevalue.split(" ");
//进行链表的创建
//创建一个虚拟节点
Node dummyHead=new Node(-1);
Node tail=dummyHead;
for (int i=0; i<n;i++){
//链表的尾插
Node node=new Node(Integer.parseInt(nodes[i]));
//将输入的节点依次插入到tail后面
tail.next=node;
tail=node;
}
//获取左区间和右区间的范围
//nextLine遇到空格就读取然后结束了,因而不会像next()一样
//产生空格导致读取到空
String part=scanner.nextLine();
int left=Integer.parseInt(part.split(" ")[0]);
int right=Integer.parseInt(part.split(" ")[1]);
//开始执行实现反转的函数
Node newHead=reversePartList(dummyHead.next,left,right);
//进行输出处理
while (newHead!=null){
System.out.println(newHead.val+" ");
newHead=newHead.next;
}
}
public static Node reversePartList(Node head,int left,int right){
//从虚拟节点开始进行遍历,重新定义了一个虚拟节点
Node dummyHead=new Node(-1);
//将虚拟节点和头部节点进行连接
dummyHead.next=head;
//传进来的头节点在虚拟节点之后,即链表第一位
//将prev引用指向待反转区间的前驱节点
Node prev=dummyHead;
for (int i = 1; i < left ; i++) {
//让prev节点走left-1次
prev=prev.next;
}
//prev引用指向待反转区间的前驱节点,cur引用就是待反转区间的第一个节点
Node cur=prev.next;
for (int i = left; i < right; i++) {
//third表示第一个被删除节点的next节点
Node third=cur.next;
//把third引用从链表删除
cur.next=third.next;
//再把third节点头插入prev之后
third.next=prev.next;
prev.next=third;
}
return dummyHead.next;
}
}
②猴子分桃
import java.util.*;
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;
}
//主要考察的是数学关系式,假设n个猴子每次分桃时有Xi个桃子
//根据题目描述,每次分五堆会剩余一个桃子,因而可以在最开始先借四个桃子
//补在其中剩余的四堆里面,每次分完的桃子都在下一次要分的桃子中
//那么可以
//那么,每次都可以平分桃子xi+4个
//例如第一次分桃则是拿走(x1+4)/5,剩余(x1+4)*4/5个桃子
//第二次分则是拿走(x1+4)*4/5 /5,剩余(x1+4)*4/5*4/5
//第N次分则是拿走(x1+4)*(4/5)^n
//为满足题目要求,剩余桃子数量应为整数,且最开始桃子数量X1
//要最小,因而X1+4=5^n因而X1=5^n-4,即最开始的桃子数量至少为
//5^n-4
//老猴子分的的桃子数量:当X1最小时可求得n次均分后剩余4^n个,加上n个
//猴子每次分完给他的n个,减去借的四个,为4^n+n-4
//***************************
//这里小猴子获得的桃子包含了给老猴子的一个,因而小猴子没有多拿
//借的四个一直都在剩余那一堆里,一直能够均分为5堆
long a=(long)(Math.pow(5,n)-4);
long b=(long)(Math.pow(4,n)+n-4);
System.out.println(a+" "+b);
}
}
}