《C语言入门100例》(第18例)给定一个字符串,判定是否是C语言合法标识符 | ASCII 码的应用

【第18题】给定一个字符串,判定是否是C语言合法标识符 | ASCII 码的应用

主要知识点

字符的应用,ASCII 码的理解

习题

1. Leetcode 面试题 01.01. 判定字符是否唯一

题目描述

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

初见

确定字符串中的字符是否完全不同,即每个字符只出现一次。使用哈希表,遍历字符串统计字符数量,若某字符数量超过 1,则返回 false,否则返回 true

代码
class Solution {
public:
    bool isUnique(string astr) {
        unordered_map<char, int> cmap;
        for (auto ch: astr) {
            cmap[ch]++;
            if (cmap[ch] > 1) {
                return false;
            }
        }

        return true;
    }
};

当然,上面使用了额外的数据结构。由 ascii 码的特性,可以使用一个长度为 128 的数组做哈希操作;若题目明确说明字符串中只有字符,则可以用 int 中的每一位表示某个字母是否出现。

2. Leetcode 剑指 Offer 50. 第一个只出现一次的字符

题目描述

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

初见

由于 s 只包含小写字母,因此可以用长度为 26 的数组做哈希操作。遍历字符串统计字母出现次数后,再次遍历字符串从哈希表中查找字母出现次数,找到第一个出现次数为 1 的字母即为答案,否则返回空字符:

代码
class Solution {
public:
    char firstUniqChar(string s) {
        char result = ' ';
        int mCh[26]{0}; // 只包含小写字母
        for (auto ch: s) { // 构造哈希表
            mCh[ch - 'a']++;
        }

        for (auto ch: s) { // 找到第一个出现次数为 1 的字符
            if (mCh[ch - 'a'] == 1) {
                result = ch;
                break;
            }
        }

        return result;
    }
};

3. Leetcode 383. 赎金信

题目描述

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成

初见

可以先遍历 magazine 构造字典,存储对应字符与可用数量。之后遍历 ransomNote 从字典中取出相应字符,当字典中字符可用数量不足(<0)时,返回 false,否则返回 true。由于两个字符串均只包含小写字母,因此与上一题一样,可以选择长度为 26 的数组做哈希操作:

代码
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int mCmap[26]{0}; // 全为小写字母
        // 构造字典
        for (auto ch: magazine) {
            mCmap[ch - 'a']++;
        }

        // 从字典中取出相应字母
        for (auto ch: ransomNote) {
            mCmap[ch - 'a']--;
            if (mCmap[ch - 'a'] < 0) { // 字符数量不够则返回 false
                return false;
            }
        }

        return true;
    }
};

总结

  1. 经过 5 月训练,再看 C++ 入门有很多题目已经变简单了
  2. 中间暂时差的几个例题由于很简单,因此暂时不会补上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值