招商:笔试题(数组统计重复次数,面包累计问题)
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); } }