文章目录
加入知识星球走向人生巅峰
- 在星球里能够干什么?
1、志同道合 - 朋友圈
2、个人规划
3、打卡挑战 - 早起打卡
4、打卡挑战 - 每日一题
5、向我提问 - 深思熟虑你的问题
6、持续创作 - 优质文章输出
7、积分榜
8、每月专题算法训练(2022.05.01 - 2022.05.31)
为何要加入星球
1、为什么是朋友圈
其实星球就是一个由众多爱好者维护的知识分享社区。这里的人都超有爱的,又有才、说话又好听我超喜欢在里面分享、学习知识的感觉。
2、个人规划
我们最终注重的还是目标,有目标才会有方向,有目标,才会有动力,有目标,才能实现人生的意义。有了目标,就要制定规划,为了目标努力。
在星球里,你可以制定你自己的目标,以月为单位,努力完成它。也可以看到别人的规划和目标,不断完善自己今后的路线。
3、倒逼自己的成长
当你进入了星球以后,你会发现每个人都在为自己制定的计划和目标而努力奋斗着。看到此情此景你怎能不感动。这使得你的学习变得更有动力。
4、 每月专题训练
1、已经参加完【九日集训】,迷茫于不知如何训练的小伙伴。
2、没有参加过【九日集训】,但是有一定基础的小伙伴。
如何加入
- 途径一:加入星球,参与每日打卡;
- 途径二:早起看直播,参与每日云刷题;
- 扫描下方二维码即可加入星球与我们一起努力奋斗
- 每日直播地址:直播间
五月刷题第二天详解(附链接)
- 由于所有的代码都是C写的看着可能有点繁琐。
500. 键盘行
- 利用哈希数组,保存每行的行号。遍历所以字符串不满足条件不加入返回数组。
- 也可以直接打个表省去初始化哈希的步骤。
int getIndex(char a){ //将大小写映射到同一位置。
int ans1 = a - 'a';
int ans2 = a - 'A';
return ans1 >= 0 ? ans1 : ans2;
}
void Init(int *hash){ //初始化哈希
char a[] = "qwertyuiop";
char b[] = "asdfghjkl";
char c[] = "zxcvbnm";
int n = strlen(a);
int i;
for(i = 0; i < n; ++i){
hash[getIndex(a[i])] = 1;
}
n = strlen(b);
for(i = 0; i < n; ++i){
hash[getIndex(b[i])] = 2;
}
n = strlen(c);
for(i = 0; i < n; ++i){
hash[getIndex(c[i])] = 3;
}
}
char ** findWords(char ** words, int wordsSize, int* returnSize){
int n;
int i, pre, j;
char **ret = (char**)malloc(sizeof(char*) * wordsSize);
*returnSize = 0;
int hash[26];
memset(hash,0, sizeof(hash));
Init(hash);
for(i = 0; i < wordsSize; ++i){
j = 0;
pre = hash[getIndex(words[i][j++])];
while(words[i][j]){
if(hash[getIndex(words[i][j])] != pre){ //条件不满足退出循环
break;
}
++j;
}
if(words[i][j] == '\0'){ //条件满足直接将指针搞过来,不满足就跳过
ret[(*returnSize)++] = words[i];
}
}
return ret;
}
1160. 拼写单词
- 将字母表存起来,循环遍历单词表中的每个单词记录字母出现次数,如果两个数据不匹配就不记录。
int countCharacters(char ** words, int wordsSize, char * chars){
int hash[26];
int cmp[26];
int i, j, n, ans, cnt;
memset(hash, 0, sizeof(hash));
ans = 0;
n = strlen(chars);
for(i = 0; i < n; ++i){
++hash[chars[i] - 'a'];
}
for(i = 0; i < wordsSize; ++i){
memset(cmp, 0, sizeof(cmp));
n = strlen(words[i]);
for(j = 0; j < n; ++j){ //将某个单词存入。
++cmp[words[i][j] - 'a'];
}
cnt = 0;
for(j = 0; j < 26; ++j){
if(hash[j] < cmp[j]){ //无法拼出单词,计数清零退出计数,寄。
cnt = 0;
break;
}
cnt += cmp[j];
}
ans += cnt;
}
return ans;
}
1047. 删除字符串中的所有相邻重复项
- 用一个栈维护整个字符串。将当前字符与栈顶元素比较。
- 如果栈空就入栈。
- 如果当前字符与栈顶元素相等就出栈,跳过当前字符。
char * removeDuplicates(char * s){
int n = strlen(s);
char *stack = malloc(sizeof(char) * n + 1);
int i, top;
i = -1;
top = -1;
while(s[++i]){
if(top == -1){ //栈空入栈
stack[++top] = s[i];
continue;
}else{
if(stack[top] == s[i]){ //相等出栈,跳过当前字符
--top;
continue;
}
}
stack[++top] = s[i];
}
stack[++top] = 0; //添加字符串末尾结束符
return stack;
}
1935. 可以输入的最大单词数
- 哈希存入坏掉的键。遍历每个单词,判断是否能输入。
int canBeTypedWords(char * text, char * brokenLetters){
int hash[26];
int i, cnt, n;
memset(hash, 0, sizeof(hash));
n = strlen(text);
i = -1, cnt = 0;
while(brokenLetters[++i]){ //将整个故障字母存入表
++hash[brokenLetters[i] - 'a'];
++cnt;
}
if(cnt == 26){ //如果全坏了,那么一个单词都拼不出来了,赶紧重新买一块键盘吧。
return 0;
}
cnt = 0;
for(i = 0; i < n; ++i){
++cnt; //假设每个单词都能正常输入
while(i < n && text[i] != ' '){
if(hash[text[i] - 'a']){ //如果发现子母键损坏,将之前的计数减1并且跳到末尾空格
--cnt;
while(i < n && text[i] != ' '){
++i;
}
}else{ //情况正常向下遍历
++i;
}
}
}
return cnt;
}