目录
前言:
1.单词倒排
方法1:scanf匹配特定字符法
方法2: 双指针法
2.统计每个月兔子的总数
方法1:斐波那契数列
方法2:斐波那契的递归
3.珠玑妙算
方法:遍历
4.寻找奇数(单身狗)
方法1:遍历法
方法2:异或运算法
5.截取字符串
前言:
编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为第三篇编程题篇,每篇大约5题左右。该系列会不定期更新,敬请期待!
1.单词倒排
方法1:scanf匹配特定字符法
#include <stdio.h>
int main()
{
char str[1000][1000];
int i = 0;
while (1)
{
if (scanf("%[a-zA-Z]", str[i]))
{
i++;
}
if (getchar() == '\n')
{
break;
}
}
while(i)
{
printf("%s ", str[--i]);
}
return 0;
}
解析:
方法2: 双指针法
解题思路:
- 整体思想是
双指针法
,因此定义一对快慢指针p1,p2.- 首先寻找一个单词的
末尾
,因此当s[p1]不是字母时p1就要--,循环终止时只要p1将指向一个单词的末尾(还有单词的话),此时将用p2记录下这个单词的结尾。- 继续寻找单词的
开头
,因此当s[p1]为字母的时候就让p1--,最终p1+1指向该单词的开头,我们从p1+1遍历到p2,依次打印即可。
scanf函数不能接受带空格的字符串,所以要使用gets
函数
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char s[10000];
gets(s);
int len = strlen(s);
int p1 = len - 1, p2 = len;
while (p1>=0)
{
while (p1 >= 0 && !isalpha(s[p1]))
{
p1--;
}
p2 = p1;
while (p1 >= 0 && isalpha(s[p1]))
{
p1--;
}
int i;
for (i = p1 + 1; i <= p2; i++)
{
printf("%c", s[i]);
}
printf(" ");
}
return 0;
}
2.统计每个月兔子的总数
方法1:斐波那契数列
我们可以先来推导一下
第一个月 只有一只
第二个月 只有一只
第三个月 原先的一只生出一只共2只
第四个月 最开始的一只又生出一只 共3只
第五个月 第一只生一只,第二只到第三月 生一只,共5只
第六个月 第一只生一只,第二只生一只,第三只生一只,共8只
1 1 2 3 5 8……
可以发现f(n) = f(n-1)+f(n-2)
本质上是斐波那契数列
#include<stdio.h>
int main()
{
int arr[31],i = 0,n;
arr[0] = 1; arr[1] = 1;
scanf("%d", &n);
for (i = 2; i < n; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
printf("%d", arr[n - 1]);
return 0;
}
方法2:斐波那契的递归
#include<stdio.h>
int fb(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
return fb(n - 1) + fb(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", fb(n));
return 0;
}
3.珠玑妙算
珠玑妙算https://leetcode.cn/problems/master-mind-lcci/
方法:遍历
int* masterMind(char* solution, char* guess, int* returnSize) {
int* ret = (int*)malloc(sizeof(int) * 2);
ret[0] = 0; ret[1] = 0;
int i = 0,j=0;
for (i = 0; i < 4; i++)
{
if (solution[i] == guess[i])
{
ret[0]++;
solution[i] = ' ';
guess[i] = ' ';
}
}
for (i = 0; i < 4; i++)
{
if (solution[i]!=' ')
{
for (j = 0; j < 4; j++)
{
if (solution[i] == guess[j])
{
ret[1]++;
guess[j] = ' ';
break;
}
}
}
}
*returnSize = 2;
return ret;
}
解析:
solution: RGBY
guess: GGRR
先遍历一遍guess,每个字符一一对应
R-G G-G B-R Y-R
我们把相同的当成一次猜中,即G==G,即为一次,并把这两个字符抵消
然后我们再次遍历guess中的每一位,这时候我们需要在整个solution中搜索是否有这个字符,如果有则抵消solution和guess中的字符,并当成一次伪猜中,然后下一个字符照旧
4.寻找奇数(单身狗)
方法1:遍历法
#include<stdio.h>
int main()
{
int n = 0, arr[2000000],i=0,count=0,j=0,flg=0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n-1; i++)
{
if (arr[i] < 0)
{
continue;
}
count = 1;
for (j = i+1; j < n; j++)
{
if (arr[j]>0 && arr[i] == arr[j])
{
arr[j] = arr[j] * -1;
count++;
}
}
if (count % 2 != 0)
{
flg = arr[i];
break;
}
}
printf("%d",flg);
return 0;
}
但会超时
方法2:异或运算法
总结:利用异或运算可以算出出现奇数次的数字
#include<stdio.h>
int main()
{
int n = 0;
int ans = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
int tmp = 0;
scanf("%d",&tmp);
ans ^= tmp;
}
printf("%d\n", ans);
return 0;
}
5.截取字符串
解析:
截取字符串前 n 个字符,只需要将数组 n 下标位置的数据替换为字符串结尾标志即可
#include <stdio.h>
int main()
{
char str[101];
scanf("%s", str) > 0;
int n;
scanf("%d", &n);
str[n] = '\0';
printf("%s\n", str);
return 0;
}
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞