目录
题目
思路
Code
题目
题目内容:
你是某连锁酒店的数据分析师。
酒店每天都会用一串编码记录各分店收到的服务请求类型。
编码由小写字母 a 到 z 组成,每个字母代表一种特定类型的服务请求。
为了优化资源分配,总部需要找出当天内重复出现的服务类型。
重复服务类型需要按照它们首次出现的时间顺序生成报告。
给定服务记录字符串 record,请找出所有出现超过一次的服务类型。
如果没有服务类型重复出现,返回空列表。
输入描述:
输入为一个字符串 record,仅包含小写字母 a 到 z。
输出描述:
输出一个列表,包含所有出现超过一次的服务类型编号。
结果按照服务类型首次出现的顺序排列。
若无重复类型,输出空列表。
输出格式为 JSON 风格列表,元素使用英文双引号包裹,多个元素之间使用英文逗号分隔,逗号后不加空格。
样例 1
输入:
programming输出:
["r","g","m"]说明:
r、g、m 都出现超过一次,按首次出现顺序输出。
样例 2
输入:
hello输出:
["l"]说明:
只有 l 重复出现。
样例 3
输入:
abcde输出:
[]说明:
所有服务类型都只出现一次。
思路
整体思路:先统计每个字符的总次数,再按原字符串顺序收集重复字符。
第一步:遍历 record,统计 26 个小写字母的出现次数。
第二步:再次从左到右扫描 record,判断当前字符总次数是否大于 1。
第三步:如果当前字符重复且尚未加入结果,则加入答案并标记已加入。
第四步:按题目指定的 JSON 风格列表格式输出。
边界处理:没有重复字符时答案列表为空,输出 []。
复杂度分析:字符串扫描两次,时间复杂度为 O(n),字符集固定,空间复杂度为 O(1)。
Code
import sys record = sys.stdin.read().strip() # 只有小写字母,固定 26 长度数组比哈希表更直接。 freq = [0] * 26 for ch in record: # 先统计总次数,后续才能判断是否重复。 freq[ord(ch) - 97] += 1 added = [False] * 26 ans = [] # 第二次扫描保留原字符串顺序,第一次遇到重复类型就输出。 for ch in record: idx = ord(ch) - 97 # 第一次遇到重复服务类型时加入,顺序自然是首次出现顺序。 if freq[idx] > 1 and not added[idx]: ans.append(ch) added[idx] = True # 输出要求是 JSON 风格列表,元素之间没有空格。 # 手动拼接以满足逗号后不加空格的输出要求。 print("[" + ",".join(f'"{ch}"' for ch in ans) + "]")JS
const fs = require("fs"); const record = fs.readFileSync(0, "utf8").trim(); // 服务类型只有 26 个小写字母,用数组计数即可。 const freq = Array(26).fill(0); for (const ch of record) { // 先统计每种服务类型出现次数。 freq[ch.charCodeAt(0) - 97]++; } // added 保证每种重复服务类型只输出一次。 const added = Array(26).fill(false); const ans = []; for (const ch of record) { const idx = ch.charCodeAt(0) - 97; // 第一次遇到重复类型时加入答案。 if (freq[idx] > 1 && !added[idx]) { ans.push(ch); added[idx] = true; } } // 输出 JSON 风格列表,元素间不带空格。 // 手动生成 JSON 风格列表,避免默认数组输出带空格或单引号。 console.log(`[${ans.map(ch => `"${ch}"`).join(",")}]`);【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集
【华为od机试真题Python】:Python真题题库
【华为od机试真题JavaScript】:JavaScript真题题库
【华为od机试真题Java&Go】:Java&Go真题题库
【华为od机试真题C++】:C++真题题库
【华为od机试真题C语言】:C语言真题题库
【华为od面试手撕代码题库】:面试手撕代码题库
【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】
华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。