作为一个才学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类型返回即可
步骤:
-
遍历字符串,把每个字母的出现情况记录在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 "";
}
};