首页 > 其他分享 >荣耀 10.8 开发笔试 笔经

荣耀 10.8 开发笔试 笔经

时间:2024-10-10 11:33:06浏览次数:8  
标签:字符 String 10.8 笔试 up 笔经 low 字符串 new

我好像是卷 1

第一题: 完善字符串

输入字符串(子串数、子串,形如 2 abc 123456789),子串未满8个则填充0使其总长度达到8个字符,超过8个则分割

核心部分:

for (String part : parts) {
  // 处理每8个字符
  for (int i = 0; i < part.length(); i += 8) {
    String chunk = part.substring(i, Math.min(i + 8, part.length()));
    // 如果长度不足8,在末尾补0
    if (chunk.length() < 8) {
      // 当chunk的长度小于8时,%-8s会在chunk的末尾添加空格,使其总长度达到8个字符
      // 然后将空格替换为0
      chunk = String.format("%-8s", chunk).replace(' ', '0');
      result.add(chunk);
    }
  }
}

第二题:十进制转16位二进制补码

有点奇淫巧技了,因为计算机用二进制存的直接提出来就行

public static String convertToBinary16(int num) {
    if (num < - Math.pow(2, 15) || num > Math.pow(2, 15) - 1) {
        return  num > 0 ? "0111111111111111" : "1000000000000000";
    }

    StringBuilder binary = new StringBuilder();

    // 从最高位开始,逐位检查并添加到结果中
    for (int i = 15; i >= 0; i--) {
        // 使用位运算检查每一位
        if ((num & (1 << i)) != 0) {
            binary.append('1');
        } else {
            binary.append('0');
        }
    }

    return binary.toString();
}

第三题:蛇形字符串

想了很久没想明白,以为是DP啥的试了半天,最后发现其实什么都不用能分解问题就能写出来,主要是题目描述太复杂了,吃一堑长一智了唉。。。太难过了

题目描述

输入一个字符串(不含空格), 请寻找输入中包含所有蛇形字符串。
蛇形字符串定义:

1.蛇形字符串由连续字符对组成,其特点如下:
1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小)。如:Aa,Dd;
1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc或OoPpQqRrSs;

2.从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
2.1 每次寻找必须是最长的蛇形字符串;
2.2 使用过的字符不能重复使用;

详细题目请看

解法

  • 我认为最重要的一点是字符串顺序不重要,这是后面一切思路的基础
  • 大写字母必须紧跟小写字母,所以确保一一对应——如果3个A 2个a,那么最多组成两个Aa

所以思路大致如下:

  1. 统计输入字符串中大写和小写字母的出现次数
  2. 在大写字母映射中寻找同时存在于小写字母映射中的字母
  3. 对这些字母进行排序,并找出最长的连续字母子串。
  4. 构建一个新字符串,将最长连续字母子串中的每个大写字母与其对应的小写字母配对
  5. 将构建的字符串添加到结果列表中,并减少相应字母的计数,如果个数为0,移除该字母
  6. 重复
import java.util.*;

class SnackStr {
    // 主方法,处理输入字符串并返回结果列表
    public List<String> snack(String s) {
        // 用于存储大写字母及其出现次数的映射
        Map<Character, Integer> up = new HashMap<>();
        // 用于存储小写字母及其出现次数的映射
        Map<Character, Integer> low = new HashMap<>();

        // 遍历字符串中的每个字符
        for (char chr : s.toCharArray()) {
            // 如果是小写字母,更新low映射
            if ('a' <= chr && chr <= 'z') {
                low.put(chr, low.getOrDefault(chr, 0) + 1);
            }
            // 如果是大写字母,更新up映射
            if ('A' <= chr && chr <= 'Z') {
                up.put(chr, up.getOrDefault(chr, 0) + 1);
            }
        }

        // 用于存储结果的列表
        List<String> res = new ArrayList<>();
        // 当up映射不为空时,继续处理
        while (!up.isEmpty()) {
            // 获取同时存在于up和low映射中的字符
            // 仅处理这些字符(且只用保存大写形式)
            List<Character> chars = getUpLowChar(up, low);
            // 如果没有这样的字符,跳出循环
            if (chars.isEmpty()) {
                break;
            }
            // 对字符列表进行排序
            Collections.sort(chars);
            // 获取最长的连续字符子串
            String out = maxLen(chars);
            // 构建结果字符串
            StringBuilder sb = new StringBuilder();
            for (char x : out.toCharArray()) {
                sb.append(x).append(Character.toLowerCase(x));
            }
            // 将结果字符串添加到结果列表中
            res.add(sb.toString());
            // 减少up和low映射中对应字符的计数
            decrease(out, up, low);
        }
        return res;
    }

    // 获取同时存在于up和low映射中的字符
    private List<Character> getUpLowChar(Map<Character, Integer> up, Map<Character, Integer> low) {
        List<Character> res = new ArrayList<>();
        for (char key : up.keySet()) {
            if (low.containsKey(Character.toLowerCase(key))) {
                res.add(key);
            }
        }
        return res;
    }

    // 获取字符列表中最长的连续字符子串
    private String maxLen(List<Character> s) {
        // s 是排序后的字符列表
        if (s.isEmpty()) return "";
        StringBuilder maxEnd = new StringBuilder().append(s.getFirst());
        StringBuilder res = new StringBuilder().append(s.getFirst());
        for (int i = 1; i < s.size(); i++) {
            // s.get(i) - s.get(i - 1) == 1 检查当前字符是否是前一个字符的下一个字母。
            // 例如,'B' - 'A' == 1,表示它们是连续的
            if (s.get(i) - s.get(i - 1) == 1) {
                maxEnd.append(s.get(i));
            } else {
                // 不连续,从当前开始继续找
                maxEnd = new StringBuilder().append(s.get(i));
            }
            // 更新结果
            if (maxEnd.length() > res.length()) {
                res = new StringBuilder(maxEnd);
            }
        }
        return res.toString();
    }

    // 减少up和low映射中对应字符的计数
    private void decrease(String s, Map<Character, Integer> up, Map<Character, Integer> low) {
        for (char chr : s.toCharArray()) {
            up.put(chr, up.get(chr) - 1);
            if (up.get(chr) == 0) {
                up.remove(chr);
            }
            char lowerChr = Character.toLowerCase(chr);
            low.put(lowerChr, low.get(lowerChr) - 1);
            if (low.get(lowerChr) == 0) {
                low.remove(lowerChr);
            }
        }
    }

    // 主方法,用于测试
    public static void main(String[] args) {
        SnackStr solution = new SnackStr();
        String test = "SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^^%%^UnbnvccTRChnyvcxcvVCFR";
        for (String x : solution.snack(test)) {
            System.out.println(x);
        }
    }
}

标签:字符,String,10.8,笔试,up,笔经,low,字符串,new
From: https://www.cnblogs.com/youtmdyang/p/18455990

相关文章

  • 【test】2024.10.8
    次大值思路发现性质,对于一个数\[a[i]\%a[j]\lea[i]\]当他取得最大值时\(a[i]<a[j]\)于是对于前&n-1&大的数,他的贡献值就是他本身,所以我们只需要保存第\(n-1\),\(n-2\)大的数就可以。但是此时要注意第\(n\)大的数的贡献值没有计算,由于\(a[n]\%a[n-2]<a[n-2]\),所以如果他要......
  • 10.8
    以下代码的输出结果是什么?intX=100;intY=200;System.out.println("X+Y="+X+Y);System.out.println(X+Y+"=X+Y");为什么会有这样的输出结果?第一条输出结果是:X+Y=100200第二条输出结果是:300=X+Y第一条中“”中输出形式为字符串然后又连接了另一个数字,最终产生了一个字符......
  • 10.8日noip联考总结
    10.8日noip联考总结T1考试的时候没有想到可以快速用组合数进行统计答案,于是在正常的匹配栈里还套了一个\(O(n)\)的统计答案。其实只需要在里面统计个数,在用乘法原理就可以了。括号匹配引导我们使用匹配栈,而需要快速统计答案又可以想到组合计数。T2这题不用输出方案的话就......
  • 10.8学习
    1.CAP★一致性(2PC、3PC、Paxos、Raft)●强一致性:数据库一致性,牺牲了性能ACID:原子性、一致性、隔离性、持久性●弱一致性:数据库和缓存,延迟双删、重试●单调读一致性:缓存一致性,ID或者IP哈希●最终一致性:边缘业务,消息队列★可用性(多级缓存、读写分离)●BASE基本可用:限流导......
  • 10.8
    不知道为什么学习数学相关的东西总会思绪淤塞,心情烦躁,于是狂贺不止跑来写总结。第\(2\)次$NOIP$模拟赛进步了整整\(38pts\),增幅到了\(30.4%\),来到了惊人的\(163pts\)!实际得分\(0+100+63+0\)。A.兰亭序无关风月我题序等你回悬笔一绝那岸边浪千叠情字何解怎......
  • 10.8日
    在今日早上的工程实训中的电工基础实训中学习了不同的触电事故:电击和电伤,对于应对触电事故的措施和急救措施。Js是一种弱编程语言,其中对于声明变量,变量的数据类型有Number,String、boolean、undefined、null等,变量的数据类型取决于变量的值。其中声明变量有两种,let声明在目前使用......
  • 2024.10.8 鲜花
    好题蜂鸟(难忘今宵)传说中人类在远早住于黑暗的地下之遥派出了娇小的蜂鸟找到通往光明的隧道飞过了一座一座岛好想有一个地方落脚把一个一个梦制造会不会有人能够听到寻找太阳的梦自不量力说自己也变成太阳的念头有时候寂寞几乎扛不动咽在喉咙里无人诉说我们到底在......
  • 10.8 模拟赛(2023 CSP-S 十连测 #5)
    炼石计划10月28日CSP-S十连测#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1秒了。30min。T2题目越短越难。但是链的是经典题目,写了。小样例太水,大样例太大,不方便猜结论。于是先写暴力然后自己造样例。模拟了五六组感觉可以按照lca的深度降序排序,然后能选就选。这......
  • 2024.10.8 test
    nf#34A定义两个长度相等的数列相似,当且仅当每个下标对应值在两个数列中的排名相等。对于一个长\(n\)的排列,定义\(f(A,k)\)表示有多少长\(k\)的排列和\(A\)的至少一个子序列相似。排列\(A\)的值是\(\sum_{k=1}^n[f(A,k)=C_n^k]\)。给出一个排列,有若干位置待定,求值......
  • 2024年华为OD笔试机试E卷- 补种未成活胡杨 (java/c++/python)
    华为OD机试E卷2024真题目录(java&c++&python)本人习惯先看输入输出描述,可以明确知道哪些数据已知,需要去得到什么结果,再代入更有目的性地阅读题干内容,快速理解,所以把输入输出描述放在前面,你可以试下这样阅读对你是否有帮助。输入描述N总种植数量1≤N≤100000M......