提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录一下第一次笔试 顺便查漏补缺
一、最后三道编程题
第一题:
牛牛有一个由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协议