题解 | #提取不重复的整数#
提取不重复的整数
https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1
#include <algorithm> #include <iostream> using namespace std; int main() { string n; cin>>n; reverse(n.begin(),n.end()); //将字符串 n 反转,以便从右向左处理 bool vis[256]={false}; //布尔数组 vis,大小为 256(覆盖所有 ASCII 字符),初始值为 false。 注意初始化的方式,用大括号。 for(char c:n){ //这里遍历的时候是用char类型 不使用int if(!vis[c]){ //[1] vis[c]=true; cout<<c; } } return 0; } // 64 位输出请用 printf("%lld")
[1] 为什么要使用布尔数组 vis
?
- 记录访问状态:我们需要一个数据结构来记录哪些数字已经被处理过。布尔数组 vis 正好可以满足这个需求,因为它可以高效地记录每个数字是否已经被访问过。
- 快速查找和更新:布尔数组提供了常数时间复杂度 (O(1)) 的查找和更新操作,非常适合这种场景。
为什么大小是 256?
- ASCII 字符集:ASCII 字符集包含 128 个字符(从 0 到 127),扩展的 ASCII 字符集包含 256 个字符(从 0 到 255)。使用 256 作为数组大小可以覆盖所有可能的字符,包括标准 ASCII 和扩展 ASCII 字符。
- 字符到整数的映射:在 C++ 中,字符类型 char 可以隐式转换为整数类型。例如,字符 '0' 对应整数 48,字符 '1' 对应整数 49,依此类推。因此,我们可以直接使用字符作为布尔数组的索引来记录该字符是否被访问过。
如何使用字符作为索引?
- 隐式转换:当你在布尔数组 vis 中使用字符 c 作为索引时,C++ 会自动将字符 c 转换为其对应的 ASCII 值。例如,如果 c 是字符 '0',那么 vis[c] 实际上是 vis[48]。
- 示例:假设 c 是字符 '5',其 ASCII 值是 53。vis[c] 实际上是 vis[53],表示字符 '5' 是否被访问过。