招商:笔试题(数组统计重复次数,面包累计问题)

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);
    }
}
原文地址:https://www.cnblogs.com/haimishasha/p/11476855.html