题目:*~奇数位上都是奇数或者偶数位上都是偶数
题目描述:
给定一个长度不小于2的数组arr。 写一个函数调整arr,使arr中要么所有的偶数位上都是偶数,要么所有的奇数位上都是奇数上。
要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6…算作偶数位,下标1,3,5,7…算作奇数位,例如[1,2,3,4]调整为[2,1,4,3]即可
题解:
(1)循环遍历arr数组:如果m及n没有到数组最后,遍历数组
(2)偶数位m从0往后遍历数组,如果arr[m]是偶数,满足要求,往后遍历到下一个偶数位
(3)奇数位n从0往后遍历数组,如果arr[n]是奇数,满足要求,往后遍历到下一个奇数位
(4)如果都不满足条件,即偶数位是奇数,奇数位是偶数,则交换
(5)继续遍历完数组
public class Solution {
/**
* 奇数位上都是奇数或者偶数位上都是偶数
* 输入:数组arr,长度大于2
* 将arr调整成奇数位上都是奇数或者偶数位上都是偶数
*/
public void oddInOddEvenInEven(int[] arr) {
int m=0;
int n=1;
while(m<arr.length&&n<arr.length){
if(arr[m]%2==0){
m+=2;
continue;
}
if(arr[n]%2==1){
n+=2;
continue;
}
//执行到这以下代码一定是奇数位是偶数,偶数位是奇数,需要交换
int tmp=arr[m];
arr[m]=arr[n];
arr[n]=tmp;
}
}
}
题目:猴子分桃
题目描述:
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。输入描述: 输入包括多组测试数据。 每组测试数据包括一个整数n(1≤n≤20)。 输入以0结束,该行不做处理。
输出描述: 每组测试数据对应一行输出。 包括两个整数a,b。 分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。
题解:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
int n=scan.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);
}
}
}