C/C++哈希表与字符串进阶面试题
题目 1字母异位词分组题目描述给你一个字符串数组请你将字母异位词组合在一起。字母异位词指字母相同但排列不同的字符串。解题思路哈希表分组法 互为异位词的字符串排序后结果完全相同。以「排序后的字符串」作为 key原字符串作为 value 存入哈希表最终将哈希表中的 value 分组输出即可。代码实现cpp运行vectorvectorstring groupAnagrams(vectorstring strs) { unordered_mapstring, vectorstring hash; for (string s : strs) { string key s; sort(key.begin(), key.end()); // 排序后作为key hash[key].push_back(s); } vectorvectorstring res; for (auto pair : hash) { res.push_back(pair.second); } return res; }复杂度分析时间复杂度O (n * k log k)n 是字符串数量k 是字符串最大长度空间复杂度O (n*k)哈希表存储所有字符面试考点哈希表的分组应用。面试官常追问如果字符串很长排序开销大有没有更优的 key 生成方式可用字符计数数组作为 key题目 2无重复字符的最长子串题目描述给定一个字符串s请你找出其中不含有重复字符的最长子串的长度。解题思路滑动窗口 哈希表 维护一个滑动窗口[left, right]用哈希表记录字符最后一次出现的索引右指针不断向右扩展遇到重复字符时将左指针移动到「重复字符上一次出现位置 1」和「当前 left」的较大值每次更新窗口最大长度代码实现cpp运行int lengthOfLongestSubstring(string s) { unordered_mapchar, int hash; int left 0; int maxLen 0; for (int right 0; right s.size(); right) { // 如果字符已在窗口内更新左边界 if (hash.count(s[right]) hash[s[right]] left) { left hash[s[right]] 1; } hash[s[right]] right; maxLen max(maxLen, right - left 1); } return maxLen; }复杂度分析时间复杂度O (n)右指针只遍历一次空间复杂度O (1)字符集有限如 ASCII哈希表大小固定面试考点滑动窗口经典题是字符串高频考点。重点考察窗口边界的维护和重复字符的处理逻辑。题目 3第一个只出现一次的字符题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有返回一个单空格。s 只包含小写字母。解题思路两次遍历 计数数组 因为只有小写字母用长度为 26 的数组代替哈希表第一次遍历统计每个字符出现的次数第二次遍历按顺序检查每个字符的计数第一个计数为 1 的就是答案代码实现cpp运行char firstUniqChar(string s) { int count[26] {0}; for (char c : s) { count[c - a]; } for (char c : s) { if (count[c - a] 1) { return c; } } return ; }复杂度分析时间复杂度O (n)两次线性遍历空间复杂度O (1)固定大小的计数数组面试考点考察数组代替哈希表的优化思想。延伸问如果字符范围很大怎么办如果是流数据无法二次遍历怎么办题目 4字符串转整数atoi题目描述请你来实现一个myAtoi(string s)函数使其能将字符串转换成一个 32 位有符号整数。需要处理前导空格、正负号、溢出截断、非数字字符提前终止等情况。解题思路按步骤处理跳过前导空格判断正负号记录符号位逐位转换数字每一步检查是否溢出溢出时根据符号返回 INT_MAX 或 INT_MIN代码实现cpp运行int myAtoi(string s) { int i 0; int sign 1; long res 0; // 用long暂存方便判断溢出 // 1. 跳过空格 while (i s.size() s[i] ) i; // 2. 处理符号 if (i s.size() (s[i] || s[i] -)) { sign (s[i] -) ? -1 : 1; i; } // 3. 转换数字 while (i s.size() isdigit(s[i])) { res res * 10 (s[i] - 0); // 溢出判断 if (res * sign INT_MAX) return INT_MAX; if (res * sign INT_MIN) return INT_MIN; i; } return res * sign; }复杂度分析时间复杂度O (n)空间复杂度O (1)面试考点考察边界处理能力经典的细节题。面试官重点看溢出处理、符号处理、异常终止的逻辑是否严谨。谢谢