C++查找两组字符串中整数交集 逐字符对比误匹配问题求助
问题根因
你当前的实现是逐字符遍历两个字符串进行比对,没有先把字符串切分为独立的整数值,直接导致两个异常:
- 逗号、空格在两个输入字符串中都存在,会被误判为匹配项保留
- 多位数会被拆分为单个数字字符匹配,比如示例中第一个字符串的
3,会因为第二个字符串的13包含字符3被误判为匹配
修复方案
按「拆分字符串转整数→找整数交集→拼接为结果字符串」的流程实现即可,完整可运行代码如下:
#include <string> #include <iostream> #include <sstream> #include <vector> #include <unordered_set> using namespace std; // 工具函数:把带逗号分隔的数字字符串转成整数vector vector<int> strToNumVec(const string& s) { vector<int> res; stringstream ss(s); string temp; // 按逗号作为分隔符切分 while (getline(ss, temp, ',')) { // 自动忽略子串前导空格,转成int存入 res.push_back(stoi(temp)); } return res; } string FindIntersection(string strArr[], int arrLength) { // 把两个输入字符串都转成整数列表 vector<int> vec1 = strToNumVec(strArr[0]); vector<int> vec2 = strToNumVec(strArr[1]); // 把第二个列表的数存入哈希集合,加快查找速度 unordered_set<int> numSet(vec2.begin(), vec2.end()); string matched = ""; for (int num : vec1) { if (numSet.count(num)) { // 已经有匹配项的话先加逗号分隔 if (!matched.empty()) { matched += ","; } // 整数转字符串拼到结果里 matched += to_string(num); } } return matched; } int main(void) { string A[] = { "1, 3, 4, 7, 13", "1, 2, 4, 13, 15" }; int arrLength = sizeof(A) / sizeof(*A); cout << "elemets 1: " << A[0] << '\n'; cout << "elemets 2: " << A[1] << '\n'; cout << '\n' << "matched number in both elemets:" << '\n' << FindIntersection(A, arrLength); return 0; }
运行输出
elemets 1: 1, 3, 4, 7, 13 elemets 2: 1, 2, 4, 13, 15 matched number in both elemets: 1,4,13
和你期望的输出完全一致。
疑问解答
- 是否需要转成整数再对比?是,转成整数对比可以完全避免分隔符、多位数拆分的问题,逻辑更简洁不容易出错。
- 匹配到的整数是否需要转成字符串再输出?是,因为函数返回值要求是字符串格式,所以匹配到的整数需要转成字符串后再拼接为最终结果。
内容的提问来源于stack exchange,提问作者Davidson Cassagnol
相关产品推荐
相关产品推荐

