pat刷题记录

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值