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


    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);
        }
    }
  • 相关阅读:
    经典小故事
    清晨六问
    ui相关书籍
    ui设计书籍推荐
    生成器
    函数之装饰器
    函数之闭包
    函数之作用域的查找顺序
    函数之命名空间/名字空间/名称空间
    内置函数
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11476855.html
Copyright © 2020-2023  润新知