当前位置: 首页 > news >正文

C++学习记录-旧题新做-回文排列

原题解题记录:https://blog.csdn.net/chamao_/article/details/143233406?fromshare=blogdetail&sharetype=blogdetail&sharerId=143233406&sharerefer=PC&sharesource=chamao_&sharefrom=from_link

C++解法(自己写的):

class Solution { public: bool canPermutePalindrome(string s) { int max = s[0]; int min = s[0]; for(int i = 0; s[i] != '\0'; i++) { // 找到字符串中ASCII码最大的和最小的,用于后续创建哈希表 if(max <= s[i]) { max = s[i]; } if(min >= s[i]) { min = s[i]; } } std::vector<int> arr(max - min + 1, 0); // 统计每种字符出现的次数 for(int i = 0; s[i] != '\0'; i++) { arr[s[i] - min]++; } int odd = 0; for(int i = 0; i < max-min+1; i++) { // 统计出现奇数次的字符数量 if(arr[i]%2 != 0) { odd++; } } if(odd <= 1) { return true; } else { return false; } } };

下面是AI辅助修改为更C++风格的代码:

class Solution { public: bool canPermutePalindrome(const std::string& s) { if (s.empty()) return true; char max_c = s[0]; char min_c = s[0]; for (char c : s) { if (c > max_c) max_c = c; if (c < min_c) min_c = c; } std::vector<int> arr(max_c - min_c + 1, 0); for (char c : s) { arr[c - min_c]++; } int odd = 0; for (int count : arr) { if (count % 2 != 0) ++odd; } return odd <= 1; } };

在C++中,用std::vector<int> arr(n, 0);可以等价于C中的calloc(n, sizeof(int));

刚开始的代码主要有这些地方不符合C++风格:

问题 1:使用s[i] != '\0'遍历字符串(C 风格)

这是典型的C 字符串写法,但:

std::string并不是以'\0'作为遍历终止条件的容器!

这在 C++ 风格中是不推荐的。
正确 C++ 用法应该用:

  • s.size()

  • Range-based for

  • 迭代器

即可。


问题 2:maxmin用 int,并且命名和 std::max/min 冲突

maxmin是标准库函数名,容易冲突。
而且你用int存字符,也是 C 风格。

建议用:

char max_c = s[0]; char min_c = s[0];

char max_c = s[0]; char min_c = s[0];

如果需要计算差值,再强制转成unsigned charint


问题 3:for 循环下标也用 int,不符合 C++ 容器约定

std::string.size()返回size_t,用 int 容易出现类型警告。


问题 4:s[i]连续访问多次,不现代

C++ 更推荐:

for (char c : s)

for (char c : s)


问题 5:可以避免第一次遍历找 min/max

因为 ASCII 字符最多 128 种,也可以直接定义固定大小:

std::array<int, 128> count{};

std::array<int, 128> count{};

但如果你坚持按原思路写,也可以。

http://www.cnnetsun.cn/news/21357.html

相关文章:

  • 从“查重焦虑”到“逻辑自洽”:一个本科生如何用智能工具重建论文写作的底层信心
  • LIO-SAM Ouster 128线激光雷达实战配置指南:从入门到性能提升
  • 从“憋不出引言”到“理清逻辑链”:一位本科生如何用智能工具重构毕业论文写作路径
  • 从“焦虑选题”到“逻辑闭环”:一名本科生如何在毕业季用智能工具完成学术初体验的华丽转身
  • 【MWORKS使用技巧72】1分钟带你了解在Sysblock中如何定义函数及算法
  • 借JAVA之力,解锁旅行攻略与搭子新玩法
  • JAVA旅行系统:攻略在手,搭子同行无忧
  • 语音识别技术在教育场景的应用实践与工具选型探索
  • 三步搞定verl:RLHF训练环境快速部署手册
  • 好写作AI:复杂算法的“金牌翻译”,让你论文的引言不再“不说人话”
  • 好写作AI:当枯燥的统计表格,遇上会讲故事的AI“翻译官”
  • 重磅︱数字孪生风洞「风神NF3」发布!
  • 审计场景中录音转文字工具的技术实现与选型指南
  • Livewire完整入门指南:5分钟掌握Laravel动态界面开发
  • Origami Simulator实战指南:从零开始掌握数字折纸艺术
  • 波浪带鱼理论:过滤无效信号,提升投资收益的法宝
  • Step1X-Edit v1.2发布:推理编辑能力跃升,重新定义AI图像创作标准
  • BlenderMCP像素艺术转换终极指南:从3D模型到复古游戏资产的快速上手
  • OpenMower机器人割草机固件测试实战指南
  • 23、深入解析Kubernetes集群扩展与高级网络
  • Many Notes:打造高效云端笔记的终极解决方案
  • 【网络安全】渗透测试零基础入门之什么是文件包含漏洞?一文带你讲清其中的原理!
  • TypeScript:现代前端开发的类型约束者
  • 专业字体文件转换完全指南:ttctools使用详解
  • Descript Audio Codec:终极音频压缩解决方案,90倍压缩率重塑音质体验
  • 利用 DeepSeek 提升工作效率
  • Webhook.site终极选择指南:自部署与云端方案深度解析
  • PHPBrew自定义任务终极指南:扩展开发与实战技巧
  • 如何优雅重构HP-Socket应用:Deno 2.0兼容性深度解析与迁移策略
  • 老旧Mac升级终极指南:完整教程解锁macOS兼容新世界