哔哩哔哩2020秋招笔试真题【翻转字符串】【字符数组中两个字符串加起来最小】【背包问题】

1.原地翻转字符串

第一题:翻转字符串 (空间复杂度O(1))
先将I am a students.翻转.tneduts a ma I,然后空格分隔,并将每个字串各自翻转
翻转使用双指针去交换左右两边。
I am a student.翻转成student. a am I

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        char[] chs = s.toCharArray();
        swap(chs, 0,s.length() - 1);
        String reverse = String.valueOf(chs);
        StringBuilder sb = new StringBuilder();
        String[] sArray = reverse.split(" ");
        for (int i = 0; i < sArray.length; i++) {
            char[] chars = sArray[i].toCharArray();
            swap(chars, 0, chars.length - 1);
            sb.append(chars);
            sb.append(" ".toCharArray());
        }
        System.out.println(sb.toString().trim());
    }
 
    public static void swap(char[] chs, int left, int right) {
        while (left < right) {
            char tmp = chs[left];
            chs[left] = chs[right];
            chs[right] = tmp;
            left++;
            right--;
        }
    }

2.字符数组中两个字符串加起来最小

第二题:和题字符串拼接最小字典序相似,输入多个字符串然后可以依次组合,输出组合最小的字符串(因为之前听过左神的课,知道了此用法)
思路:贪心的思路!重写比较器,比较两种相加情况,两个字符串加起来(可以有两种不同的相加情况:a + b和b + a),哪一个作为前缀结果小那么就将哪一个排在前面,例如:如果(a + b) >(b + a) 那么b放在前面。
这样将每次排在最前面的拿出来拼接,那么结果就最小。

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String data = sc.next();
        String[] dataArray = data.split(",");
        if (dataArray == null) System.out.println(data);
        PriorityQueue<String> pQ = new PriorityQueue<String>(new Comparator<String>() { 
        	@Override 
        	public int compare(String o1, String o2) {
                if (Long.valueOf(o1 + o2) > Long.valueOf(o2 + o1)) {
                    return 1;
                } else if (Long.valueOf(o1 + o2) == Long.valueOf(o2 + o1)) {
                    return 0;
                } else {
                    return -1;
                }
            }
        });
        for (String s : dataArray) {
            s = s.trim();
            pQ.add(s);
        }
        StringBuilder sb = new StringBuilder();
        while (!pQ.isEmpty()) {
            sb.append(pQ.poll());
        }
        System.out.println(sb.toString());
    }

第三题:背包问题

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] weight = new int[N];  
        int[] value = new int[N];  
        for (int i = 0; i < N; i++) {
            weight[i] = sc.nextInt();
        }
        for (int i = 0; i < N; i++) {
            value[i] = sc.nextInt();
        }
        int [][]dp=new int[N+1][M+1];
        for(int i=1; i<=N; i++) {
            int w=weight[i-1];
            int v=value[i-1];
            for(int j=1;j<=M;j++) {
                if(j>=w) {
                    dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-w]+v);
                }else {
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        System.out.println(dp[N][M]);
    }

你可能感兴趣的:(校招笔试真题)