1. 公共后缀
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096
样例输入1
3
Itai nyan~
Ninjin wa iyadanyan~
uhhh nyan~
样例输出1
nyan~
样例输入2
3
Itai!
Ninjinnwaiyada T_T
T_T
样例输出2
nai
代码
#include<cstdio>
#include<cstring>
#define maxChar 260 //如果256可能会有错误,因为涉及到换行符
#define maxN 100
int main() {
int N;
int suffixLen = 0; //公共后缀长度
char centence[100][maxChar]; //读取的字符串
char common[maxChar];
int len[maxN], minLen = maxChar;
scanf("%d", &N);
getchar();
for(int i=0;i<N;i++) {
fgets(centence[i],maxChar,stdin);
len[i] = (int) strlen(centence[i])-1;
if(len[i] < minLen) minLen = len[i]; //确定从后向前读取的长度,只要大于等于最短字符串即可
}
for(int j=0;j<minLen;j++) {
bool flag = true;
char c = centence[0][len[0]-j-1];
for(int i=1;i<N;i++) {
if(centence[i][len[i]-j-1]!=c) { //这里的遍历更像是广度优先,将每一位后缀比较
flag = false;
break;
}
}
if(flag){
common[suffixLen++] = c;
} else {
break;
}
}
if(suffixLen == 0) printf("nai\n");
else {
for(int i=suffixLen-1;i>=0;i--){
putchar(common[i]);
}
}
}
2. 拆分整数
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805347145859072
样例输入1
3
167334
2333
12345678
样例输出1
Yes
No
No
代码
#include<cstdio>
#include<cstring>
int convert(char s[], int start, int len) { //将一个字符串数组转为对应的数字
int n = 0;
for(int i=start;i<len;i++) {
n = n*10 + (s[i] - '0');
}
return n;
}
int main() {
int N;
char num[40];
scanf("%d", &N);
getchar();
for(int i=0;i<N;i++) {
int len, half, a, b, c;
scanf("%s", num);
len = (int)strlen(num);
half = len>>1;
a = convert(num, 0, len);
b = convert(num, 0, half);
c = convert(num, half, len);
if(b*c!= 0 && a % (b*c) == 0){
printf("Yes\n");
} else {
printf("No\n");
}
}
}
3. 黑洞数
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805400954585088
样例输入1
6767
样例输出1
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[4];
bool check(int n) {
for(int i=1;i<4;i++) {
if(a[i] != a[i-1]) return false;
}
return true;
}
bool cmp(char a, char b) { //这个可以学习一下,数组的比较用了char,用int肯定可以,但是char通用性应该是更强
return a>=b;
}
void intToArr(int n) {
int i = 0;
if(n/1000==0) a[3] = 0; //4位数字首位可能出现0
while(n > 0) {
a[i++] = n%10;
n /= 10;
}
}
int arrToInt() {
int t= 0;
for(int i=0;i<4;i++) {
t = t*10 +a[i];
}
return t;
}
int main() {
int n;
scanf("%d", &n);
int p,q,r;
intToArr(n);
if(check(n)) {
printf("%d - %d = 0000\n", n,n);
} else {
while(true) {
sort(a, a+4, cmp);
p = arrToInt();
sort(a, a+4);
q = arrToInt();
r = p-q;
printf("%04d - %04d = %04d\n", p, q, r); //占位符的使用
if(r == 6174) return 0;
intToArr(r);
}
}
}
4. 寻找平均值
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805360777347072
样例输入1
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
样例输出1
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
样例输入2
2
aaa -9999
样例输出2
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
代码
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
int n, cnt = 0;
char a[50], b[50];
double temp, sum = 0.0;
cin >> n;
for(int i = 0; i < n; i++) {
scanf("%s", a);
sscanf(a, "%lf", &temp); //将a读入temp中
sprintf(b, "%.2lf",temp); //将temp读入b中
int flag = 0;
for(int j = 0; j < strlen(a); j++) { //比较两个数字的每位是否相同(如果不是两位小数就会不同)
if(a[j] != b[j]) {
flag = 1;
}
}
if(flag || temp < -1000 || temp > 1000) {
printf("ERROR: %s is not a legal number\n", a);
continue;
} else {
sum += temp;
cnt++;
}
}
if(cnt == 1)
printf("The average of 1 number is %.2lf", sum);
else if(cnt > 1)
printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}
5. 坏键盘
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805357933608960
样例输入1
3
caseee1__thiiis_iiisss_a_teeeeeest
样例输出1
ei
case1__this_isss_a_teest
代码
#include<iostream>
#include<cstring>
using namespace std;
#define M 256
bool marked[M], printed[M];
int main() {
fill(marked, marked + M, true); //默认所有键都是坏的
fill(printed, printed + M, false);//用来记录的坏键是否在结果中已经输出了
int k,len;
char s[1005];
scanf("%d", &k);
scanf("%s", s);
len = (int) strlen(s);
for(int i=0, j,code;i<len;) { //有点类似kmp,这里算是双指针的思想
//i 是当前字符串所对应的字符,j 在循环中就是和i一样的字符最终是i所对应字符向后重复过j-i次的字符
j = i+1;
code = s[i];
while(j<len && s[j] == s[j-1]) j++;
if((j-i) % k!=0) marked[code] = false; //如果出现该种情况说明这个字符并不是每次都是出现k次,则标记为好的键
i = j;
}
char r[1005]; //r是最终正常输出的字符串
int rlen = 0; //用来标记最终正常字符串的索引
for(int i=0, code;i<len;) {
code = s[i];
r[rlen++] = code;
if(marked[code]) {
i += k; //出现坏的字符则让原字符串的索引向后k位,省略了那些重复出现的字符串
if(!printed[code]){ //判断这个坏键是不是打印过了,如果打印过了就不打印了
putchar(code);
printed[code] = true;
}
} else {
i++;
}
}
r[rlen] = '\0';
printf("\n%s", r);
}
6. 演讲模式
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805398257647616
样例输入1
Can1: “Can a can can a can? It can!”
样例输出1
can 5
代码
#include<iostream>
#include<map>
#include<string>
#include<cctype>
using namespace std;
int main() {
string str, word;
map<string,int> m;
getline(cin, str);
int len = str.length();
for(int i=0;i<len;i++) {
word.clear();
while(i<len && isalnum(str[i])) {
word.push_back(tolower(str[i++]));
}
if(word.length()==0) continue;
if(m.find(word) == m.end()) {
m[word] = 1;
} else {
m[word]++;
}
}
string res;
int maxCnt = -1;
for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
if(it->second>maxCnt) {
maxCnt = it->second;
res = it->first;
}
}
cout<< res << " "<<maxCnt;
return 0;
}