经典编程面试题--大文件找串对

关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;

推荐专栏10天学会使用asp.net编程AI大模型,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可接项目赚外快,绝对划算。不仅学会如何编程,还将学会如何将AI技术应用到实际问题中,为您的职业生涯增添一笔宝贵的财富。

-------------------------------------正文----------------------------------------

一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba

-------------------------------------答案----------------------------------------

处理这个问题,我们可以考虑使用一个哈希表(例如 unordered_map)来存储字符串及其对应的逆序字符串。遍历文件时,我们先计算每个字符串的逆序,然后检查逆序是否已经在哈希表中存在。如果存在,则说明我们找到了一对相反的串。

由于每个字符串长度不超过1K,逆序操作的时间复杂度是线性的(O(n)),其中n是字符串的长度。整体的时间复杂度主要依赖于文件读取和哈希表操作。

以下是一个基本的C++实现方案:

#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <string>  
#include <unordered_map>  
  
std::string reverseString(const std::string& str) {  
    std::string rev = str;  
    std::reverse(rev.begin(), rev.end());  
    return rev;  
}  
  
int main() {  
    std::ifstream file("input.txt"); // 假设文件名为 input.txt  
    std::string line;  
    std::unordered_map<std::string, std::string> reversedMap;  
    int pairCount = 0;  
  
    if (!file.is_open()) {  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    while (std::getline(file, line)) {  
        std::string reversed = reverseString(line);  
  
        // 检查逆序是否已经在哈希表中  
        if (reversedMap.find(reversed) != reversedMap.end()) {  
            // 如果找到,则输出这一对相反的串  
            std::cout << "找到相反串对: " << reversedMap[reversed] << " 和 " << line << std::endl;  
            pairCount++;  
        }  
  
        // 插入当前字符串的逆序到哈希表,值为原字符串  
        reversedMap[line] = reversed;  
    }  
  
    std::cout << "总共找到 " << pairCount << " 对相反的串。" << std::endl;  
  
    file.close();  
    return 0;  
}

注意

  1. 这个代码片段假设文件input.txt存在于程序运行目录中,并且文件是以文本形式存储的,每行一个字符串。
  2. 我们使用std::unordered_map来存储每个字符串及其逆序。如果逆序已经存在于哈希表中,则输出对应的原字符串和当前读取的字符串作为一对相反的串。
  3. 如果文件很大,这个程序可能会占用大量内存,因为哈希表需要存储每一个字符串及其逆序。
  4. 为了处理大规模数据,可能需要考虑使用更高效的数据结构或算法,或者优化内存使用,比如使用外部排序技术。
  5. 输出的相反串对可能会重复,如果需要唯一性,可以进一步处理输出。

这个代码示例提供了一个基本的框架,你可以根据自己的需求进行调整和优化。

 

感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。

有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。
或关注博主免费专栏【程序员宝典--常用代码分享】里面有大量面试涉及的算法或数据结构编程题。

博主其它经典原创:《管理心得--如何高效进行跨部门合作》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》,及
C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

借雨醉东风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值