1. 数组统计重复次数
/**
* @author Turing
* 给定一个长度为N的数组,其元素取值范围是[1,N],统计数组中重复元素和重复次数
* 要求时间复杂度是O(N),空间复杂度是O(1)
*/
public class Main {
public static void main(String[] args) {
int n = 6;
int[] a = new int[]{6,2,4,1,2,5};
int i = 0;
while(i<n){
//元素取值范围是[1,N],将(当前元素-1)作为下标值
int temp = a[i]-1;
if(temp< 0){//表示该元素处理过了,跳过
i++;
continue;
}else if(a[temp]>0){//第一次处理这个值
a[i] = a[temp];//暂时存储还未处理的新元素
a[temp] = -1;//本元素第一次处理,所以次数为1
}else{
a[i] = 0;//遇到了重复元素,没有新的元素要处理,置0
a[temp]--;//重复,减1,相当于重复次数加1
}
}
for (int j = 0; j < n; j++) {
System.out.println((j+1)+":"+ -a[j]);
}
}
}
2. 累计k个面包
import java.util.Scanner;
/**
* @author Turing
* 输入:
* 第一行:两个整数N,K,分别表示送面包的天数和小招需要累计拿走的免费面包数
* 第二行:n个整数,ai表示每天剩余的面包数
* 注意:小招每天至多拿走8个,如果没拿完就保存到后一天拿走
* 输出:
* 一个整数,小招累计拿到k个面包需要的最少天数,如果无法达到k个面包,输出-1
*/
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
sc.nextLine();
String [] str = sc.nextLine().trim().split(" ");
int [] a = new int[n];
for (int i = 0; i < str.length; i++) {
a[i] = Integer.valueOf(str[i].trim());
}
int time = 0;//保存多少天
for (int i = 0; i < n; i++) {
if(a[i]>8){
k = k-8;//小招每天至多拿走8个
if(i+1<n){
a[i+1]+=a[i]-8;//如果没拿完就保存到后一天拿走
}
}else{
k = k - a[i];//小于8直接拿走
}
time++;
if(k<=0){
break;//小招累计拿到k个面包需要的最少天数
}
}
if(k>0){
time = -1;//无法达到k个面包,输出-1
}
System.out.println(time);
}
}