news 2026/6/15 18:19:46

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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{};

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 9:52:15

科研新势力:书匠策AI解锁期刊论文写作全流程高效模式

在科研的浩瀚星空中,期刊论文发表宛如一颗璀璨星辰,吸引着无数研究者奋力追逐。然而,从选题策划到文献综述,从框架搭建到内容撰写,再到格式调整与查重优化,每一个环节都暗藏着挑战与艰辛。如何突破传统写作的桎梏,让科研成果以更专业、更高效的方式呈现?答案或许就藏在…

作者头像 李华
网站建设 2026/6/15 14:41:08

WindowResizer终极指南:轻松掌控任意窗口尺寸

WindowResizer终极指南&#xff1a;轻松掌控任意窗口尺寸 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为无法调整某些应用程序窗口而烦恼吗&#xff1f;WindowResizer是一款…

作者头像 李华
网站建设 2026/6/14 14:52:40

中国科学技术大学演示模板完全使用指南

中国科学技术大学演示模板完全使用指南 【免费下载链接】ustcbeamer USTC Beamer 模板&#xff08;基于学校公用 PPT 模板&#xff09; 项目地址: https://gitcode.com/gh_mirrors/us/ustcbeamer 在学术展示和专业汇报中&#xff0c;一份精美的演示文稿往往能起到事半功…

作者头像 李华
网站建设 2026/6/15 5:16:35

Mirai Console Loader 终极指南:三步打造智能QQ机器人

Mirai Console Loader 终极指南&#xff1a;三步打造智能QQ机器人 【免费下载链接】mirai-console-loader 模块化、轻量级且支持完全自定义的 mirai 加载器。 项目地址: https://gitcode.com/gh_mirrors/mi/mirai-console-loader Mirai Console Loader&#xff08;简称M…

作者头像 李华
网站建设 2026/6/14 19:43:06

DoublePulsar检测脚本使用指南:快速识别系统后门

DoublePulsar是NSA利用的著名后门程序&#xff0c;曾在2017年的"永恒之蓝"勒索软件攻击中广泛传播。这款由Countercept开发的开源检测脚本&#xff0c;能帮助系统管理员和安全研究人员快速检测系统是否受到DoublePulsar感染。 【免费下载链接】doublepulsar-detectio…

作者头像 李华
网站建设 2026/6/15 15:23:41

基于Bayes优化的CNN - BiLSTM回归预测:多输入单输出模型实践

基于贝叶斯(bayes)优化卷积神经网络-双向长短期记忆网络(CNN-BiLSTM)回归预测&#xff0c;bayes-CNN-BiLSTM多输入单输出模型。 优化参数为&#xff1a;学习率&#xff0c;隐含层节点&#xff0c;正则化参数。 评价指标包括:R2、MAE、MSE、RMSE和MAPE等&#xff0c;代码质量极高…

作者头像 李华