作为一个才学C艹的菜鸡,打周赛就如同坐牢一般,愣是一个题都没在规定时间内写出来。最后调试两个多小时才把第一题写出来了。

写这篇博客就是想记录一下自己写周赛题的题解吧

题目描述:https://leetcode.cn/problems/greatest-english-letter-in-upper-and-lower-case/

由于C++学的很浅,我用的是C语言的思维写题

/*整体思路:首先定义一个a[26]{0}来存放各个小写英文字母出现的情况,下标顺序与字母表顺序相同(a的下标是0)。 如果题目字符串中某字母大小写同时出现,利用cnt变量记录他在字母表中的位置,然后使a[cnt]++; 最后倒序找到值不为0的a[i],获取i下标,找到符合要求的字母在字母表中的位置,然后通过i+65还原大写字母,利用 string类的构造函数把char类型变成string类型返回即可

步骤:

  1. 遍历字符串,把每个字母的出现情况记录在a数组中。 使用双重循环。j = 0,第一层以第j个字母为基准,第二层k = j +1 ,一直往后遍(k++),直达字符串长度,然后j++。之后以第二个字母为基准·····

    由于需要判断基准字母是大写还是小写,定义一个char类型temp来接收基准字母后面的每一个字符:temp = a[k] 如果为大写,就要找基准字母对应的小写,把不为小写的其后字母变成小写: temp = a[k] +32 ;反之,temp = a[k] -32;

然后开始比较:基准字母为大写,那么所找的其后字母应为小写,比较基准字母是否等于其后字母-32 如果相等,则通过基准字母(或者正确的其后字母)的ASCALL码找到它在字母表的位置,存入a数组中 同理如果基准字母为小写·······

注意:这里的比较必须有个前置条件:基准字母不能等于其后字母。 eg: 输入zzzz :基准字母z 其后字母变为大写Z。比较的时候 基准字母z肯定等于 Z - 32,这会导致错误的计数。

2.开始返回题设要求的字母

首先检查是否没有符合题目要求的字母:

cnt现在是记录a数组中为0的元素。只要cnt == 26,说明没有一个字母是大小写同时出现的,那么直接返回空字符串return "";

如果有满足题目要求的字母存在:

利用倒序遍历然后返回比较好: i = 25,只要a[i]!=0,说明有满足条件的字符存在,那么i就是所求字母在字母表中的顺序 :ans = i记录 定义char类型:char ch = ans + 65(还原出大写字母),然后使用string str(1,ch),把char类型转化为string类型,最后返回str。

代码如下

class Solution { public: string greatestLetter(string s) { int cnt = 0;//cnt用来记录s中的单个字符对应字母表中的位置 int i, j,k; int a[26]{ 0 }; char temp; for (j = 0; j < s.length() - 1; j++) { cnt = 0; for (k = j + 1; k < s.length()-j; k++) {

                temp = s[k];
                if (s[j] >= 'a' && s[j] <= 'z')
                {

                    if (s[k] >= 'a' && s[k] <= 'z')
                        temp = s[k] - 32;
                }

                if (s[j] >= 'A' && s[j] <= 'Z')
                {
                    if (s[k] >= 'Z' && s[k] <= 'A')
                        temp = s[j + 1] + 32;
                }

                if (s[j] != s[k]&&(s[j] == temp + 32 || s[j] == temp - 32))
                {
                    if (temp >= 'a' && temp <= 'z') temp = temp - 32;
                    cnt = temp - 65;
                    a[cnt]++;
                }
            }

        }
    
    int ans = 25;
    cnt = 0;
    for (i = 0; i < 26; i++)
    {
        if (a[i] == 0)
        {
            cnt++;
        }
    }

    if (cnt == 26)
    {
        return "";
    }
        for (i = 25; i >=0; i--)
        {
            if (a[i] != 0)
            {
                ans = i;
                char ch = ans + 65;
                string str(1, ch);
                return str;
            }
          
        }
        return "";
    

}

};