机试1. 报文重排序题目描述对报文进行重传和重排序是常用的可靠性机制,重传缓中区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。输入描述输入第一行为N,表示子报文的个数,0<N≤1000。输入第二行为N个子报文,以空格分开,子报文格式为:字符串报文内容+后缀顺序索引字符串报文内容由[a-z,A-Z]组成,后缀为整型值,表示顺序。 顺序值唯一,不重复。输出描述输出恢复出的原始报文,按照每个子报文的顺序的升序排序恢复出原始报文,顺序后缀需要从恢复出的报文中删除掉样例// 输入4rolling3  stone4  like1  a2// 输出like  a  rolling  stone说明4个子报文的内容分别为"rolling”,"stone”,"like”,"a",顺序值分别为3,4,1,2,按照顺序值升序并删除顺序后缀,得到恢复的原始报文:"like a rolling stone“// 输入8gifts6  and7  Exchanging1  all2  precious5  thins8  kinds3  of4// 输出Exchanging  all  kinds  of  precious  gifts  and  thingspublic class Solution3 {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        while (sc.hasNext()) {            String[] ss = sc.nextLine().split(" ");            HashMap<Integer, String> map = new HashMap<>();            for(int i = 0; i < ss.length; i++) {                for(int j = 0; j < ss[i].length(); j++) {                    if(Character.isDigit(ss[i].charAt(j))) {                        map.put(Integer.parseInt(ss[i].substring(j)), ss[i].substring(0,j));                        break;                    }                }            }            for(int i : map.keySet()) {                System.out.print(map.get(i) + " ");            }        }    }}2. 找车位题目描述停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离。输入描述一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。停车位最多100个。// 跟我机考时的回答有出入,不能保证akpublic class Solution4 {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        // 0,0,1,1,0,1,0,0,0,0,1        while(sc.hasNext()) {            String[] ss = sc.nextLine().split(",");            int max = 0, distance = 0;            int leftZeros = 0, rightZeros = 0;            int leftFlag = 0, rightFlag = 1;            for (int i = 0; i < ss.length; i++) {                if("0".equals(ss[i])) {                    distance++;                    max = Math.max(max, distance);                    if(leftFlag == 0) {                        leftZeros++;                    }                    rightZeros++;                } else {                    distance = 0;                    leftFlag = 1;                    rightZeros = 0;                }            }//            System.out.println(max + " " + leftZeros + " " + rightZeros);            System.out.println(Math.max(Math.max((max - 1) / 2, leftZeros - 1), rightZeros - 1));        }    }}3. 篮球比赛题目描述篮球(5V5)比赛中,每个球员拥有一个战斗力,每个队伍的所有球员战斗力之和为该队伍的总体战斗力。现有10个球员准备分为两队进行训练赛,教练希望2个队伍的战斗力差值能够尽可能的小,以达到最佳训练效果。给出10个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?请输出该分队方案下的最小战斗力差值。示例1:// 输入10 9 8 7 6 5 4 3 2 11// 输出11说明1 2 5 9 10分为一队,3 4 6 7 8分为一队,两队战斗力之差最小,输出差值1。备注:球员分队方案不唯一,但最小战斗力差值固定是1public class Solution5 {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        while(sc.hasNext()) {            int[] members = new int[10];            int sum = 0;            for(int i = 0; i < 10; i++) {                members[i] = sc.nextInt();                sum += members[i];            }            int count = 5;            int res = Integer.MAX_VALUE;            res = backtrack(members, 0, count, sum, res);            System.out.println(res);        }    }    public static int backtrack(int[] members, int index, int count, int sum, int res) {        if(count == 0) {            return Math.abs(sum);        }        for(int i = index + 1; i < 10; i++) {            res = Math.min(backtrack(members, i, count - 1, sum - members[i] * 2, res), res);        }        return res;    }}技术面一面一串字符串由 "1-10""A-Z" 组成,各字符之间由 "," 隔开,找到最大连续的子串。(10后面的字符是A)示例1:// 输入1,2,3,4,5,7,8// 输出1 2 3 4 5public class Solution {    // 主函数,处理输入输出,遍历字符串找到最大连续字串    // 通过指针移动找到连续字串,max记录下最长字串长度,left、right记录最长字串的左右边界    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        while(sc.hasNext()) {            String[] ss = sc.nextLine().split(",");            int index = 0;            int max = 0;            int left = 0, right = 0;            for (int i = 0; i < ss.length; i++) {                if (isSubSequence(ss, index, i)) {                    if (max < i - index) {                        max = i - index;                        left = index;                        right = i;                    }                } else {                    index = i;                }            }            for(int i = left; i <= right; i++) {                System.out.print(ss[i] + " ");            }        }    }    // 判断是否连续字串    public static boolean isSubSequence(String[] ss, int left, int right) {        for(int i = left; i < right; i++) {            if(!isNextValue(ss[i], ss[i + 1])) {                return false;            }        }        return true;    }    // 判断两个字符是否顺序关系    public static boolean isNextValue(String s1, String s2) {        if("10".equals(s1)) {            return "A".equals(s2);        }        if(s1.charAt(0) + 1 == s2.charAt(0)){            return true;        }        return false;    }}技术面一面一队士兵排成一排,身穿绿色跟黑色衣服,如果可以随便将一个士兵移除队伍,那么求最长的连续绿色衣服的士兵队伍。public class Solution1 {    public static void main(String[] args) {            // 模拟士兵队伍,绿色衣服记为1,黑色衣服记为0            String s = "111101110111110";            int left = 0, right = 0, len = s.length(), max = 0, count = 0, start = 0;            for(int i = 0; i < len; i++) {                if(s.charAt(i) == '0') {                    count++;                }                if(count <= 1) {                    if(max < i - start + 1) {                        max = i - start + 1;                        left = start;                        right = i;                    }                }                while(count > 1) {                    if (s.charAt(start) == '0') {                        count--;                    }                    start++;                }            }            int cnt = 0;            for(int i = left; i <= right; i++) {                if(s.charAt(i) == '1') {                    cnt++;                }            }            System.out.println(cnt);        }}
点赞 9
评论 3
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务