8-8美团笔试
总共五题编程,虐了我两个小时(😂有大佬帮我帮我解答一下吗)
小美和小团在玩游戏。小美将会给出n个大小在1到n之间(包括1和n)的整数,然后小美会再告诉小团一个整数k,小团需要找到一个最小的整数x满足以下条件: 整数x的大小在1到n之间(包括1和n) 在小美给出的n个整数中,恰好有k个数严格比x小只ac了90%,也没超时,,,搞不明白😥
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt();
while(m-->0){
int n=scanner.nextInt();
int k=scanner.nextInt();
int[] nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=scanner.nextInt();
}
Arrays.sort(nums);
int ans=nums[k-1]+1;
if((k<n&&ans>nums[k])||ans>n){
System.out.println("NO");
} else{
System.out.println("YES\n"+ans);
}
}
} 优化:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt();
while(m-->0){
int n=scanner.nextInt();
int k=scanner.nextInt();
int[] nums=new int[n+1];
for(int i=0;i<n;i++){
int j=scanner.nextInt();
nums[j]++;
}
if(k==n){
if(nums[n]!=0){
System.out.println("NO");
} else{
for(int i=n;i>0;i--){
if(nums[i]!=0){
System.out.println("YES\n"+(i+1));
break;
}
}
}
} else {
int cnt = 0;
int i = 1;
for (; i <= n; i++) {
cnt += nums[i];
if (cnt >= k) {
break;
}
}
if (cnt != k) {
System.out.println("NO");
} else {
System.out.println("YES\n" + (i + 1));
}
}
}
} 小美给了小团一个长度为n(n为偶数)的序列A,序列中的数都是介于[1,100000]的整数。小团想把这个序列变得漂亮后再送回给小美。小美觉得一个序列是漂亮的当且仅当这个序列的前一半和后一半是一样的,即对于1<=i<=n/2都满足A[i]==A[i+n/2]。 小团可以按进行以下操作任意次: 选择两个介于[1, 100000]之间的数x和y,然后将序列A中所有值为x的数替换为y。 注意,每次操作都会在上一次操作后得到的序列上进行。小团想知道他最少需要操作多少次可以把序列变成漂亮的。这题完全不会,没思路😂
