2020.9.25搜狗笔试

题目结构

三道编程题

1.判断对的题目的个数

数学推理题

import java.util.*;

class Interval {
  int start;
  int end;
}

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回Interval类,start代表汪仔最少做对了多少道题,end代表汪仔最多做对了多少道题。
     * @param n int整型 选择题总数
     * @param k int整型 朋友做对的题数
     * @param str1 string字符串 长度为n只包含ABCD的字符串,其中第i个代表汪仔第i题做出的选择
     * @param str2 string字符串 长度为n只包含ABCD的字符串,其中第i个代表朋友第i题做出的选择
     * @return Interval类
     */
    public Interval solve (int n, int k, String str1, String str2) {
        // write code here
        int  count = 0;
        for(int i = 0; i < n; i++){
            if(str1.charAt(i) == str2.charAt(i)){
                count++;
            }
        }

        int i = count;
        Interval val = new Interval();

        //最多
        if(i > k){
            val.end = k+(n-i);
        }else{
            val.end = i+(n-k);
        }

        //最少
        if(k < n-i){
            val.start = 0;
        }else{
            val.start = k-(n-i);
        }

        return val;

    }

}

2.旋转数组

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回一行字符串,表示原文。
     * @params1 string字符串一维数组 N*N的01矩阵,表示解密纸,0表示透明,1表示涂黑
     * @params2 string字符串一维数组 字符矩阵,表示密文
     * @return string字符串
     */

    public static void main(String[] args) {
        String[] s1 = {"1101","1010","1111","1110"};
        String[] s2 = {"ABCD","EFGH","IJKL","MNPQ"};
        System.out.println(new Solution().rotatePassword(s1, s2));
    }

    /*
    ["1101","1010","1111","1110"],["ABCD","EFGH","IJKL","MNPQ"]

    "CFHQGLMPAIKNBDEJ"

     */
    public String rotatePassword (String[] s1, String[] s2) {
        // write code here

        int n = s1.length;

        StringBuilder sb = new StringBuilder();

        int k = 4;
        int[][] num = change(s1);
        while((k--) > 0){
            for(int i = 0; i < n;i++){
                for(int j = 0; j < n; j++){
                    if(num[i][j] == 0){
                        sb.append(s2[i].charAt(j));
                    }
                }
            }
            rotate(num);
        }

        //System.out.println(sb);
        return sb.toString();

    }

    //把字符串数组改成int数组
    public static int[][] change(String[] s){
        int n = s.length;
        int[][] num = new int[n][n];

        for(int i = 0; i < n;i++){
            for(int j = 0; j < n; j++){
                num[i][j] = s[i].charAt(j) - '0';   //直接取出来是字符0
                //System.out.println(num[i][j]);
            }
        }
        return num;
    }



    public static void rotate(int[][] matrix){
        int n=  matrix.length;
        int[][] newMatrix = new int[n][n];

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                newMatrix[j][n-i-1] = matrix[i][j];
            }
        }

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                matrix[i][j] = newMatrix[i][j];
            }
        }
    }
}

3.图遍历

借楼,别人家的,参考一下,学习一下,记录在此
原链接

 public Interval trim(int n, int m, Interval[] conn) {
        // write code here
        Map<Integer, List<Integer>> opp = new HashMap<>();
        Map<Integer, List<Integer>> neg = new HashMap<>();

        int[] color = new int[n + 1];
        for (int i = 0; i < m; i++) {
            List<Integer> oppList = opp.computeIfAbsent(conn[i].start, k -> new ArrayList<>());
            List<Integer> negList = neg.computeIfAbsent(conn[i].end, k -> new ArrayList<>());
            oppList.add(conn[i].end);
            negList.add(conn[i].start);
        }
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(-1);
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            List<Integer> negList = neg.get(cur);
            if (negList != null) {
                for (int next : negList) {
                    if (color[next] == 0) {
                        color[next] = 1;
                        queue.offer(next);
                    }
                }
            }
        }
        queue.offer(0);
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            List<Integer> oppList = opp.get(cur);
            if (oppList != null) {
                for (int next : oppList) {
                    if (next != -1 && color[next] == 1) {
                        color[next] = 2;
                        queue.offer(next);
                    }
                }
            }
        }
        int cnt = 0, sum = 0;
        for (int i = 1; i <= n; i++) {
            if (color[i] == 2) {
                cnt++;
                sum += i;
                sum %= 100000007;
            }
        }
        return new Interval(cnt, sum);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值