去哪儿笔试 秋招2025

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录一下第一次笔试 顺便查漏补缺

一、最后三道编程题

第一题:

牛牛有一个由n个整数组成的数组[a1,a2,.,an],他想将这n个数打乱后依次拼接,使得拼接得到的字符串字典序是所有拼接字符串中最小的。直接输出这个打乱过后的数组。
输入描述:第一行输入一个整数n(1≤n≤105)代表数组中的元素数量。第二行输入n个整数a1,a2,…,an(0≤ai≤109)代表数组元素
输出描述:在第一行上输出n个整数,代表重新排列后的数组

java
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            String[] s=new String[n];
            for (int i = 0; i < n; i++) {
                s[i]=String.valueOf(sc.next());
            }
            Arrays.sort(s,(a,b)->(a+b).compareTo(b+a));
            for (String string : s) {
                System.out.print(string+" ");
            }
        }
    }
}

第二题:

去哪儿会员体系分为大众、白银、黄金、铂金和钻石会员五个等级,等级成长度值越大,成长度越高,等级也就越高,也能够享受更多的会员权益。这天,牛牛发现可以通过完成每日任务的方式快速获得成长度提升等值!一共有N个任务,每天都会解锁一个新的任务,第i个任务达成后可以获得ai点成长度奖励。

为了鼓励用户参与任务,在开始任务之前,还可以进入“挑战”模式,提前预设自己能够坚持的天数x,在完成挑战后,可以得到前x张奖励翻倍卡,你可以自由选择翻卡片的使用顺序,使得每一天的成长度奖励翻倍。第j张翻倍卡可以将任务完成的成长度值翻成对应奖励的k倍。例如:第一个任务奖励1点成长度值,第二天任务奖励2点成长度值,奖励第一张翻倍卡翻卡后第一个任务翻倍卡,那么第1天就可以得到8点成长度值,最多可以得到m点成长度值。

第一行输入两个整数n和m(1≤n≤105;1≤m≤1012)代表任务总数量和需要的成长值数量。第二行n个整数 a1,a2,…,an(0≤ai≤103)代表每一个任务奖励的成长值点第三行n个整数b1,b2,…,bn(1≤bi≤103)代表按顺字摆放的翻倍卡的面值。
示例1:输出3
5 20
1 2 3 4 5
4 2 3 5 10
示例2:输出-1
2 20
1 2
4 2

java
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n=sc.nextInt();
            int value=sc.nextInt();
            int[] n_v=new int[n];
            int[] card=new int[n];
            for (int i = 0; i < n; i++) {
                n_v[i]=sc.nextInt();
            }
            for (int i = 0; i < n; i++) {
                card[i]=sc.nextInt();
            }
            if(compute(n_v,card,0)>=value){
                System.out.println(1);
                continue;
            }
            int tmp=compute(n_v,card,n-1);
            if(tmp<value){
                System.out.println(-1);
                continue;
            }else if(tmp==value){
                System.out.println(n);
                continue;
            }
            int l=1,r=n-2;
            while(l<=r){
                int mid=(l+r)/2;
                if(compute(n_v,card,mid)<value){
                    l=mid+1;
                }else if(compute(n_v,card,mid)>value){
                    r=mid-1;
                }else{
//                    System.out.println(mid+1);
                    break;
                }
            }
            System.out.println(l+1);
        }
    }
    public static int compute(int[]n_v,int[]card,int l){
        int[] sort_n_v=count_sort(n_v,l);
        int[] sort_card=count_sort(card,l);
        int sum=0;
        for (int i = 0; i <= l; i++) {
            sum+=sort_n_v[i]*sort_card[i];
        }
        return sum;
    }
    public static int[] count_sort(int[] array,int l){
        int max=Integer.MIN_VALUE,min=Integer.MAX_VALUE;
        int len=l+1;
        for (int i = 0; i < len; i++) {
            max=Math.max(max,array[i]);
            min=Math.min(min,array[i]);
        }
        int[]bucket=new int[max-min+1];
        for (int i = 0; i < len; i++) {
            bucket[array[i]-min]++;
        }
        for (int i = 1; i < bucket.length; i++) {
            bucket[i]=bucket[i-1]+bucket[i];
        }
        int[]output=new int[len];
        for(int i=len-1;i>=0;i--){
            output[(bucket[array[i]-min]--)-1]=array[i];
        }
        return output;
    }
}

再提供几个测试用例:

输入:
10 1000
10 20 30 40 50 60 70 80 90 100
2 3 4 5 6 7 8 9 10 11
输出:
6

输入:
3 10
0 0 0
5 10 15
输出:-1

第三题

如果一个字符串s可以由某个字符串t重复x(x>1)次得到,就称字符串s为一个真周期串。例如:s=01230123,t=0123,x=2。对于一个只包含数字0-9的字符串S,可以执行任意次(也可以不执行)操作,选择任意两个下标,交换两个下标的字符。更正式地说,选择i,j(i≠j)交换Si和Sj。如果字符串S经过操作后可以变成真周期串,那么称S为伪周期串。现在给定一个只包含数字0-9的字符串T,问:最多可以将字符串T划分成几个伪周期串?更正式地说,找出一个大小为k的伪周期串集合P,使得T=P1+P2+…+Pk输出最大的k。

二、选择题知识点(部分)

  • Java static private public 方法及运行顺序
  • java hashmap底层存储逻辑
  • 调度算法
  • BIO NIO AIO
  • 对象序列化
  • HTTP协议
诺瓦FPGA秋招笔试题主要分为两个部分,第一部分是专业知识测试,第二部分是编程题。 专业知识测试部分包括了FPGA的基础知识、Verilog语言、时序设计以及数字电路等方面。例如,可能会涉及到FPGA的组成原理、时序约束的设置、时钟域划分、时钟频率的设计、异步时序的处理等方面的问题。这部分的题目主要是考察考生对于FPGA的整体架构和设计流程的理,以及对于一些常见问题的决能力。 编程题部分可能会要求考生使用Verilog语言进行硬件描述,或者使用Vivado等FPGA开发工具进行仿真、综合和实现等流程。题目可能包括多个模块的设计与连接、时序要求的满足、状态机的设计、数据通路的实现等方面的内容。这部分的题目主要是考察考生的编程能力和对于FPGA开发流程的熟悉程度。 对于这样的笔试题,我建议考生首先通读题目,理清各个要求和步骤,然后有针对性地回答问题。在回答过程中要注重思路的清晰和逻辑的严谨,遇到不会的问题可以先跳过,尽量保证其他部分的答案的完整性。在回答编程题时,要注意代码的规范性和可读性,以及对于时序约束和时钟域的处理。尽量利用仿真工具进行测试,确保设计的正确性和功能的完备性。 总之,对于诺瓦FPGA笔试题,需要考生具备扎实的FPGA基础知识和Verilog编程能力,同时熟悉FPGA开发流程和工具的使用。只有全面理题目要求,有条不紊地回答问题,才能在笔试中取得好成绩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值