0928携程java岗笔试情况及java代码(AK)


代码等笔试结束后更新~
祝大家顺利~


第一题   

题目:判断字符串str1能否通过交换一次不同位置的两个字符编程str2。
思路:暴力模拟。
代码:
import java.util.*;

/*
3
abc acb
goto goto
arc abc

Yes
Yes
No
 */
public class Q1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            String[] strs = str.split(" ");
            if(func(strs[0],strs[1])) {
                System.out.println("Yes");
            }
            else{
                System.out.println("No");
            }
        }
    }

    public static boolean func(String str1, String str2) {
       // System.out.println("str1:"+str1+"\nstr2:"+str2);
        if(str1.length() != str2.length()) {
            return false;
        }
        HashMap<Character,Integer> cnt1 = new HashMap<>();
        char str1ch = 'a',str2ch = 'a';
        int difCnt = 0;
        boolean flag = false;
        for (int i = 0; i < str1.length(); i++) {
            cnt1.put(str1.charAt(i),cnt1.getOrDefault(str1.charAt(i),0)+1);
            if(cnt1.get(str1.charAt(i))>=2) flag = true;
      //      System.out.println("\t"+i+"\tch:("+str1.charAt(i)+","+str2.charAt(i)+")");
            if(str1.charAt(i)!=str2.charAt(i)) {
                if(difCnt == 0) {
                    str1ch = str1.charAt(i);
                    str2ch = str2.charAt(i);
                    difCnt++;
                  //  System.out.println("\t\tstr1ch:"+str1ch+"\tstr2ch:"+str2ch+"\tdifCnt:"+difCnt);
                }
                else if(difCnt == 1) {
                   // System.out.println("\t\tstr1ch:"+str1ch+"\tstr2ch:"+str2ch+"\tdifCnt:"+difCnt);
                    if(str1.charAt(i)!=str2ch || str1ch != str2.charAt(i)) {
                        return false;
                    }
                    difCnt++;
                }
                else {
                    return false;
                }
            }
        }
        if(difCnt == 0) {
            if(flag) return true;
            return false;
        }
        return difCnt==2;
    }
}


第二题

题目:一个仅由233,2330,233X10^k的数相加而得的数称为233数,给一个数n(n<=10^14),判断n是否是一个233数,如果不是输出-1,如果是,则输出构成n最少的233数个数。
思路:由233数的定义可知,233数求余233必须为0,否则输出-1。然后构造一个数组,里面的元素分别为233x10^12, 233x10^11, .... , 233x10^1, 233;然后从大到小判断n是否大于当前数a[i],如果大于,则ans+=(n/a[i]),然后更新ans为ans%a[i],即可
代码
import java.util.Scanner;
/*
4
232
233
466
23300

-1
1
2
1

 */
public class Q2{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long arr[] = new long[14];
        arr[0] = 233;
        for (int i = 1; i < arr.length; i++) {
            arr[i] = arr[i-1] * 10;
        }
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            long x = sc.nextLong();
            int ans = 0;
            if(x%233 != 0) {
                System.out.println(-1);
                continue;
            }
            else {
                for (int j = arr.length-1; j >= 0; j--) {
                    if(x < arr[j]) {
                        continue;
                    }
                    ans += x/arr[j];
                    x = x%arr[j];
                }
            }
            System.out.println(ans);
        }
    }
}

第三题

题目大意:给一个数组,考虑将其中的最多k个数剔除数组,并加入这k个数的平均值,问数组中最大值和最小值的差最小能为多少?
思路:先将数组排序,然后/分别考虑从左边剔除i(0<=i<=k)个元素,右边剔除k-i个元素的情况下,保存数组最大值和最小值差距的最小值。(平均值通过前缀和数组求)
代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

/*
4 2
5 4 2 4

0.5

4 4
5 4 2 4

0
 */
public class Q3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        if (n <= k) {
            System.out.println(0);
            return;
        }
        double arr[] = new double[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextDouble();
        }
        Arrays.sort(arr);
        double leftSum[] = new double[k + 1];
        double rightSum[] = new double[k + 1];
        for (int i = 1; i <= k; i++) {
            leftSum[i] = leftSum[i - 1] + arr[i - 1];
        }
        for (int i = n - 1; i >= n - k; i--) {
            rightSum[n - i] = rightSum[n - i - 1] + arr[i];
        }
        double ans = arr[n - 1] - arr[0];
        for (int i = 0; i <= k; i++) {
            int j = k - i;
            double avg = (leftSum[i] + rightSum[j]) / (i + j);
            double max = Math.max(arr[n - 1 - j], avg);
            double min = Math.min(arr[i], avg);
            ans = Math.min(ans, max - min);
        }
        System.out.println(ans);
    }
}

第四题

题目大意:k-好数组(定义:任何一个长度为k的连续数组和都相同)给了t个样例,每个样例给出数组长度n,连续子数组的长度k,以及可增加的次数x。问能不能把给出的数组变成一个k-好数组,每次可以把数组中的一个元素+1,最多可以增x次。
思路:由于任意两个长度为k的数组和都必须相同,可以推出x(i) + x(i+1) + .... + x(i+k-1) = x(i+1) + ... + x(i+k-1) + x(i+k) 可以推出 x(i) = x(i+k),因此可以先将数组中的元素分为k组,然后记录每组的元素个数和最大值,因为每组中的所有元素最终都要相同,所以对于下标为j(0<j<n)的元素,其最少需要增加max[j%k]-arr[j]次。先判断总的需要加的次数,如果大于x,则返回-1。否则更新x为x'(减去需要加的数量),然后求增加后的最大值,即对每组的元素,求max[i] + ( x'/cnt[i])的最大值即可。
代码
import java.util.Scanner;
/*
3
4 3 1
1 2 1 1
4 2 5
1 2 3 4
5 3 1
1 100 1 1 1

3
4
-1
 */
public class Q4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            int x = sc.nextInt();
            int arr[] = new int[n];
            //arr[i]和arr[i+k]必须相等
            //因此分成k组
            int max[] = new int[k];
            int cnt[] = new int[k];
            for (int j = 0; j < n; j++) {
                arr[j] = sc.nextInt();
                max[j%k] =  Math.max(arr[j],max[j%k]);
                cnt[j%k]++;
            }
            int needAdd = 0;
            for (int j = 0; j < n; j++) {
                needAdd += max[j%k]-arr[j];
            }
            if(needAdd > x) {
                System.out.println(-1);
            }
            else {
                x-=needAdd;
                int ans = 0;
                for (int j = 0; j < k; j++) {
                    ans = Math.max(ans,max[j]+x/cnt[j]);
                }
                System.out.println(ans);
            }
        }
    }
}


#携程笔试##携程##2023一起秋招吧##23届秋招笔面经#
全部评论
第二题其实得到num / 233的商后,把商的每一位数字加起来就是答案。。
12 回复 分享
发布于 2022-09-28 21:05 陕西
1 80% 2 ac 3 10% 4 g
4 回复 分享
发布于 2022-09-28 21:00 香港
第二题,x / 233 = y , 将y的各数位加起来就是答案
3 回复 分享
发布于 2022-09-28 21:05 上海
两题选手来补题啦
2 回复 分享
发布于 2022-09-28 21:09 上海
第三题一直纠结到底是用左边的数,还是右边的数,原来直接暴力求个最小值就好了
2 回复 分享
发布于 2022-09-28 21:09 江西
第三题,可惜,没想到这么做,因为题中没说一定得取k个数,可以比k小,就把人给整不会啦
2 回复 分享
发布于 2022-09-28 21:21 陕西
tql,等dl代码学习一下
1 回复 分享
发布于 2022-09-28 20:40 浙江
等代码
1 回复 分享
发布于 2022-09-28 21:00 江苏
0.8 1 0.05 0第四题一点思路都没有 g
1 回复 分享
发布于 2022-09-28 21:06 上海
大佬nb
1 回复 分享
发布于 2022-09-28 21:14 湖南
第四题的思维转换可太重要了,知道了 k-好数组 对应的就是第 i 元素 所在 i%k 组内元素值相等。可惜当时脑子转了差不多一个小时也没转出来。
1 回复 分享
发布于 2022-09-28 21:42 北京
您好,能解释一下最后一题剩余的x吗?然后求增加后的最大值,即对每组的元素,求max[i] + ( x'/cnt[i])的最大值即可。这里不太懂
1 回复 分享
发布于 2022-09-29 16:51 北京
1一直卡80,吐了
点赞 回复 分享
发布于 2022-09-28 21:00 湖南
100 100 10 0 强迫症十分满足(最后一题是什么鬼啊 直接交了不做了 哪位大佬教教我?给个思路就好
点赞 回复 分享
发布于 2022-09-28 21:01 陕西
第一题     public static String getRes(String s){         String[] strs = s.split(" ");         if (strs[0].equals(strs[1])) return "Yes";         int preIndex=0;         int nextIndex=0;         int count=0;         for (int i=0; i<strs[0].length(); i++){             if (strs[0].charAt(i)==strs[1].charAt(i)) continue;             if (strs[0].charAt(i)!=strs[1].charAt(i)&&count==0){                 preIndex=i;                 count++;             }else if (strs[0].charAt(i)!=strs[1].charAt(i)&&count==1){                 count++;                 nextIndex=i;                 boolean isRes = strs[0].charAt(preIndex)==strs[1].charAt(nextIndex) && strs[0].charAt(nextIndex)==strs[1].charAt(preIndex);                 if(!isRes) return "No";             }else{                 return "No";             }         }         if (count<2) return "No";         return "Yes";     } }
点赞 回复 分享
发布于 2022-09-28 21:02 湖北
有没有人 JS 写的第1、2题只能过 10% 呢? 1. 仅一次交换相等字符串 2. 233 数
点赞 回复 分享
发布于 2022-09-28 21:02 湖南
为啥第三题怎么写都是5%
点赞 回复 分享
发布于 2022-09-28 21:03 黑龙江
第三题中为什么可以只考虑取k个数的情况呢?而不用考虑2~k-1?
点赞 回复 分享
发布于 2022-09-28 21:50 陕西
//第二题只用各位相加就行啦~ import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int t = sc.nextInt();         for (int i = 0; i < t; ++i) {             long num = sc.nextLong();             if (num < 233 || num % 233 != 0) {                 System.out.println(-1);                 continue;             }             long n = num / 233;             int res = 0;             while (n > 0) {                 res += n % 10;                 n /= 10;             }             System.out.println(res);         }     } }
点赞 回复 分享
发布于 2022-09-28 23:20 广西
ac ac 10/100 0
点赞 回复 分享
发布于 2022-10-01 01:40 辽宁

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
21 74 评论
分享
牛客网
牛客企业服务