纯C语言|简便方法|解题报告(第18例) ASCII码

Posted 顾冷__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯C语言|简便方法|解题报告(第18例) ASCII码相关的知识,希望对你有一定的参考价值。

三道题的共同部分就是 使用一个hash[256](数组),去标记字符出现的次数,然后去完成题目的要求
现在来开始吧~

第一题判断唯一字符

int book[110];
bool isUnique(char* astr)

    memset(book,0,sizeof(book));//初始化内存
    int flg=0;
    if(strlen(astr)<=1)//单个字符或者空串,直接正确
            return true;
    for(int i=0;astr[i];i++)//book标记字符出现的次数
    
        book[astr[i]-'a']++;
        if(book[astr[i]-'a']==2)//当出现重复时,标记重复
            flg=1;
    
    if(flg)//如果标记有重复 就返回false
        return false;
    return true;
    

第二题第一次出现一次的字符

主要问题是

怎么解决第一次出现的字符,既可以使用hash映射,

也有一个简单的方法就是,

1.按照输入的顺序遍历,每个字母标记出现的次序

2.还是按照顺序遍历,找到第一个出现次序为1的字符就是所求字符(自己思考一下,很巧妙)

这样就避免了使用hash映射的方法,

int  hash[256];
char firstUniqChar(char* s)

    int i, len = strlen(s);
    memset(hash, 0, sizeof(hash));

    for (i = 0; i < len; i++) 

        hash[s[i]]++;

    for (i = 0; i < len; i++) 
    
        if (hash[s[i]] == 1) 
            return s[i];
    
    return ' ';

第三题赎金信

很简单的思路,设置一个数组去记录每个字符出现的次数, 如果出现杂志中出现+1,用一个-1,直接遍历即可,不需要考虑顺序什么别的问题
核心还是用一个数组去储存ascll值 去标记字符出现次序
空间复杂度为O(N);

int hash[256]=0;//标记数组
bool canConstruct(char * ransomNote, char * magazine)

    memset(hash,0,sizeof(hash));//初始化内存
    int len1 = strlen(magazine);//分别求长度
    int len2 = strlen(ransomNote);//并且len2>=len1 
    for(int i=0;i<len1;i++)
    
        hash[magazine[i]]++;//杂志中出现的+1
    
    for(int i=0;i<len2;i++)
    
        hash[ransomNote[i]]--;//需要一个就对该字符-1
    
    for(int i=65;i<123;i++)
    
        if(hash[i]<0)//只要有一个,就不可以
            return false;
    
    return true;

以上是关于纯C语言|简便方法|解题报告(第18例) ASCII码的主要内容,如果未能解决你的问题,请参考以下文章

[解题报告] CSDN竞赛第18期

[解题报告] CSDN竞赛第22期

[解题报告] CSDN竞赛第22期

C语言解题:18岁生日

解题报告—— 2018级2016第二学期第五周作业 删数问题

洛谷 P1450 解题报告