算法筆記—入門篇(1)—入門模擬(已完結)

 

 入門篇(1)—入門模擬c++

1.簡單模擬算法

模擬題主要考察的事代碼能力,簡單模擬不涉及算法,徹底只是根據題目描述來進行代碼的編寫。編程

 2.剩餘的樹數組

#include<stdio.h>
#include<string.h>
int tree[10010];
int main(){
    int L,M;
    while(~scanf("%d%d",&L,&M)){
        if(L==0&&M==0) break;
        memset(tree,0,sizeof(int));
        for(int i=0;i<=L;i++){
            tree[i]=1;
        }
        int s,e;
        for(int j=0;j<M;j++){
            scanf("%d%d",&s,&e);
            for(int i=s;i<=e;i++){
                tree[i]=0;
            }
        }
        int num=0;
        for(int i=0;i<=L;i++){
            if(tree[i]==1) num++;
        }
        printf("%d\n",num);
    }
    return 0;
} 

 

3.石頭剪刀布函數

記錄甲乙贏的次數和平局的次數(平局甲乙相等),計算得出輸的次數,在記錄贏的同時,記下是出什麼贏得本局,最後經過比較得出出哪個贏的概率比較大學習

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    int win1=0,los1=0;
    int win2=0,los2=0;
    int equ=0;
    char c1,c2;
    int x1=0,y1=0,z1=0;
    int x2=0,y2=0,z2=0;
    for(int i=0;i<n;i++){
        getchar(); 
        scanf("%c %c",&c1,&c2);
        if(c1=='C'&&c2=='J'||c1=='J'&&c2=='B'||c1=='B'&&c2=='C'){
            win1++;
            if(c1=='C') x1++;
            else if(c1=='J') y1++;
            else if(c1=='B') z1++;
        }else if(c1==c2){
            equ++;
        }else{
            win2++;
            if(c2=='C') x2++;
            else if(c2=='J') y2++;
            else if(c2=='B') z2++;
        }
        los1=n-win1-equ;
        los2=n-win2-equ;
    }
    printf("%d %d %d\n%d %d %d\n",win1,equ,los1,win2,equ,los2);
    
    if(x1==y1&&y1==z1){
        printf("B ");
    }else if(x1>y1&&x1>z1){
        printf("C ");
    }else if(y1>x1&&y1>z1){
        printf("J ");
    }else if(z1>x1&&z1>y1){
        printf("B ");
    }else if(x1==y1&&x1>z1){
        printf("C ");
    }else if(x1==y1&&x1>z1){
        printf("C ");
    }else if(x1==z1&&x1>y1){
        printf("B ");
    }else if(z1==y1&&z1>x1){
        printf("B ");
    }
    
    if(x2==y2&&y2==z2){
        printf("B\n");
    }else if(x2>y2&&x2>z2){
        printf("C\n");
    }else if(y2>x2&&y2>z2){
        printf("J\n");
    }else if(z2>x2&&z2>y2){
        printf("B\n");
    }else if(x2==y2&&x2>z2){
        printf("C\n");
    }else if(x2==y2&&x2>z2){
        printf("C\n");
    }else if(x2==z2&&x2>y2){
        printf("B\n");
    }else if(z2==y2&&z2>x2){
        printf("B\n");
    }
    //printf("\n1: %d %d %d\n",x1,y1,z1); 
    //printf("\n2: %d %d %d\n",x2,y2,z2); 
    return 0;
} 

 

4.A+B問題(字符串模擬加減運算)測試

問題也是看了別人的博客才寫出來的,這種思路我是沒想到,不得不佩服.網站

參考博客連接:https://blog.csdn.net/zh_ang_lei/article/details/48475651spa

#include<stdio.h>
#include<string.h>
char s1[20],s2[20];
int len1,len2;
int main(){
    while(scanf("%s %s",s1,s2)!=EOF){
        long long a=0,b=0;
        len1 = strlen(s1);
        len2 = strlen(s2);
        for(int i=0;i<len1;i++){
            if(s1[i]>='0'&&s1[i]<='9'){
                a=a*10+s1[i]-'0';
            }
        }
        if(s1[0]=='-'){
                a=-a;
        }
        for(int i=0;i<len2;i++){
            if(s2[i]>='0'&&s2[i]<='9'){
                b=b*10+s2[i]-'0';
            }
        }
        if(s2[0]=='-'){
            b=-b;
        }
        printf("%lld\n",a+b);
    }
    return 0;
}

 

5.特殊乘法.net

不得不說,思路就是制勝的法寶啊,借用上一題的處理思路,本來令我愁眉不解的題瞬間迎刃而解了。

#include<stdio.h>
#include<string.h>
char s1[20],s2[20];
int len1,len2;
int main(){
    while(scanf("%s %s",s1,s2)!=EOF){
        len1 = strlen(s1);
        len2 = strlen(s2);
        long long sum = 0;
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                sum+=(s1[i]-'0')*(s2[j]-'0');
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

 //ps:coudup網站出現故障,因此下面的題目選用了南陽理工學院的oj上的題

6.蛇形填數(經典模擬)

題目連接:http://acm.nyist.cf/problem/33

這題我沒有寫出來,參照別人的代碼AC

參照地址:https://blog.csdn.net/qq_36238595/article/details/53537672

#include<stdio.h>
#include<string.h>
int a[101][101];
int main(){
    int n;
    scanf("%d",&n);
    int x=0,y=n-1;//行列
    int num=1;//填入的數
    a[x][y]=1;//填入第一個數
    while(num<n*n){//結束條件 
        while(x+1<n&&!a[x+1][y]){//向下填數,條件爲:不超邊界,且未填入數 
            a[++x][y]=++num;
        }
        while(y-1>=0&&!a[x][y-1]){//向左 
            a[x][--y]=++num;
        } 
        while(x-1>=0&&!a[x-1][y]){//向上
            a[--x][y]=++num; 
        }
        while(y+1<n&&!a[x][y+1]){//向右
            a[x][++y]=++num; 
        } 
    }
    for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
    }
    return 0;
}

 

 7.排序去重(數據比較小的狀況下)

題目連接:http://acm.nyist.cf/problem/48

本題利用桶排序的思想,在數組容許的範圍內可以使用。

#include<stdio.h>
#include<string.h>
#define max 1001
int a[max];
int main(){
    int n,k;
    int sum=0;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        scanf("%d",&k);
        a[k]++;
    }
    for(int i=0;i<max;i++){
        if(a[i]) sum++;
    }
    printf("%d\n",sum);
    for(int j=0;j<max;j++){
        if(a[j])
            printf("%d ",j);
    }
    return 0;
}

 

8.升級版石頭剪刀布

題目連接:http://acm.nyist.cf/problem/1346

#include<stdio.h>
int main(){
    int a[3000],b[3000];
    int n,na,nb;
    while(scanf("%d%d%d",&n,&na,&nb)!=EOF){
        int wa=0,wb=0;
        for(int i=0;i<na;i++){
            scanf("%d",&a[i]);
        }
        int ma=na;
        for(int j=0;j<n/na+2;j++){//複製字符串,到須要的程度 
            for(int i=0;i<na;i++){
                a[ma++]=a[i];
            }
        }
        for(int i=0;i<nb;i++){
            scanf("%d",&b[i]);
        }
        int mb=nb;
        for(int j=0;j<n/nb+2;j++){
            for(int i=0;i<nb;i++){
                b[mb++]=b[i];
            }
        }
        for(int i=0;i<n;i++){//判斷輸贏 
            if(a[i]==0&&b[i]==2||a[i]==0&&b[i]==3||a[i]==1&&b[i]==0||a[i]==1&&b[i]==3||a[i]==2&&b[i]==1||a[i]==2&&b[i]==4||a[i]==3&&b[i]==2||a[i]==3&&b[i]==4||a[i]==4&&b[i]==0||a[i]==4&&b[i]==1) wa++; 
            if(b[i]==0&&a[i]==2||b[i]==0&&a[i]==3||b[i]==1&&a[i]==0||b[i]==1&&a[i]==3||b[i]==2&&a[i]==1||b[i]==2&&a[i]==4||b[i]==3&&a[i]==2||b[i]==3&&a[i]==4||b[i]==4&&a[i]==0||b[i]==4&&a[i]==1) wb++; 
        } 
        printf("%d %d\n",wa,wb);
    }
    return 0;
}

 

9.模擬手機鍵盤發短信

題目連接:http://acm.nyist.cf/problem/1350

 

#include<stdio.h>
#include<string.h>
int main(){
    char one[5]={'?','\'',',','.','!'};
    char two[6]={'C','a','b','c','A','B'};
    char three[6]={'F','d','e','f','D','E'};
    char four[6]={'I','g','h','i','G','H'};
    char five[6]={'L','j','k','l','J','K'};
    char six[6]={'O','m','n','o','M','N'};
    char seven[8]={'S','p','q','r','s','P','Q','R'};
    char eight[6]={'V','t','u','v','T','U'};
    char nine[8]={'Z','w','x','y','z','W','X','Y'};
    char c[10001];
    while(~scanf("%s",c)){
        int len=strlen(c);
        int sum=1;
        int i;
        for(i=0;i<len;i++){
            int sum=1;
            if(c[i]=='1'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",one[sum%5]);
            }
            if(c[i]=='2'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",two[sum%6]);
            }
            if(c[i]=='3'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",three[sum%6]);
            }
            if(c[i]=='4'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",four[sum%6]);
            }
            if(c[i]=='5'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",five[sum%6]);
            }
            if(c[i]=='6'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",six[sum%6]);
            }
            if(c[i]=='7'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",seven[sum%8]);
            }
            if(c[i]=='8'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",eight[sum%6]);
            }
            if(c[i]=='9'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",nine[sum%8]);
            }
            if(c[i]=='0'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                for(int k=0;k<sum-1;k++){
                    printf(" ");
                }
            }
        }
        printf("\n");
        
    }
    return 0;
} 

 

10.下任市長(簡單模擬)

題目連接:http://acm.nyist.cf/problem/1362

這道題難度不高,主要在於翻譯是否準確,可否瞭解題意。

須要注意的還有數組循環的處理

題目大意:多組測試樣例,輸入兩個數字n和p(n表明候選人數,包括本屆市長,p表明鵝卵石的個數),一張圓桌,候選人以逆時針的方向圍坐,桌上有一隻碗,碗裏面有p個鵝卵石,本屆市長的位置爲0,其後爲1,2,3......n-1,從0位置開始每人從碗裏拿一個石子(若是碗裏有石子的狀況下),若是碗裏沒有石子了,而其餘人手中仍有石子,你須要將你手中的石子所有放入碗中(若是你有的話),直到全部的石子所有到一我的手中,那我的就是下屆市長,輸出他的編號,結束。

#include<stdio.h>
#include<string.h>
int main(){
    int n,p;
    int cand[60];
    while(~scanf("%d%d",&n,&p)){
        if(n==0&&p==0) break;
        memset(cand,0,sizeof(cand));//初始化,每一個人手中都沒有石子
        int bowl=p;
        for(int i=0;i<n;i++){
            if(bowl>0){
                bowl--;
                cand[i]++;
            //    printf("cand[%d]:%d bowl:%d\n",i,cand[i],bowl);
            }else{
                if(cand[i]==p){
                //    printf("what is wrone?\n");
                    printf("%d\n",i);
                    break;
                }
                else{
                    bowl=cand[i];
                    cand[i]=0;
                }
            }
            if(i==n-1) i=-1;//循環
        } 
    }
    return 0;
} 

 

 11.計劃日(經典日期問題)

題目連接:http://acm.nyist.cf/problem/1363

日期問題我以爲剛開始我是比較懼怕作這樣的題的,估計之後多練就行了。

#include<cstdio>//提交用c++,用c會報編譯錯誤,我懷疑是bool函數的緣由 
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};//平閏年每個月天數
bool isLeap(int year){
    return ((year%4==0&&year%100!=0)||(year%400==0));
} 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int time,y,m,d;
        int time2;
        int w,n;
        scanf("%d%d%d",&time,&w,&n);
        y=time/10000;
        m=(time%10000)/100;
        d=time%100;
        while(n>0){
            d++;
            if(d==month[m][isLeap(y)]+1){
                m++;
                d=1;
            }
            if(m==13){
                y++;
                m=1;
            }
            w++;
            if(w==8){
                w=1;
            }
            n--;
        }
        time2=d+m*100+y*10000;
        //printf("%d%d%d %d",y,m,d,w);剛開始是以這種方式輸出,程序老是出錯。因此改成下面這種輸出方式。 
         printf("%d %d\n",time2,w);
    }
    return 0;
}

 

12.閃電大小(圖形問題)

題目連接:http://acm.nyist.cf/problem/1384

圖形問題是我之前比較討厭的一種題,剛開始三角形都不會輸出,主要是之前思路沒有打開

這題解題思路是將閃電分爲三個部分使用for循環輸出

#include<stdio.h>
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i;j++){
                printf(" ");
            }
            printf("*");
            printf("\n");
        }
        for(int i=0;i<n+1;i++){
            printf("*");
        }
        printf("\n");
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i-1;j++){
                printf(" ");
            }
            printf("*");
            printf("\n");
        }
        printf("\n");
    }
} 

 

13.再見手機鍵盤問題

這題超級簡單

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    char c[1001]; 
    scanf("%d",&n);
    while(n--){
        scanf("%s",c);
        int len=strlen(c);
        for(int i=0;i<len;i++){
            if(c[i]>='a'&&c[i]<='c') printf("2");
            if(c[i]>='d'&&c[i]<='f') printf("3");
            if(c[i]>='g'&&c[i]<='i') printf("4");
            if(c[i]>='j'&&c[i]<='l') printf("5");
            if(c[i]>='m'&&c[i]<='o') printf("6");
            if(c[i]>='p'&&c[i]<='s') printf("7");
            if(c[i]>='t'&&c[i]<='v') printf("8");
            if(c[i]>='w'&&c[i]<='z') printf("9");
        }
        printf("\n");
    }
} 

 

14.3n+1猜測(簡單模擬)

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    int step=0;
    while(n!=1){
        if(n%2==0){
            n=n/2;
        }else{
            n=(3*n+1)/2;
        }
        step++;
    }
    printf("%d\n",step);
} 

 

15.挖掘機技術哪家強

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805289432236032

#include<cstdio>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
    int n,id,score;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&id,&score);
        school[id]+=score;
    }
    int k=1,MAX=-1;
    for(int i=1;i<=n;i++){//這裏必定要注意,id是有可能等於n的 
        if(school[i]>MAX){
            MAX=school[i];
            k=i;
        }
    }
    printf("%d %d\n",k,MAX);
    return 0;
}

 

16.跟奧巴馬一塊兒學編程

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805285812551680

#include<stdio.h>
int main(){
    int n;
    char c;
    int h;
    scanf("%d",&n);
    getchar();
    scanf("%c",&c);
    if(n%2==0){
        h=n/2;
    }else{
        h=n/2+1;
    }//四捨五入
    for(int i=0;i<n;i++){
        printf("%c",c);
    } 
    printf("\n");
    for(int i=0;i<h-2;i++){
        printf("%c",c);
        for(int j=0;j<n-2;j++){
            printf(" ");
        }
        printf("%c\n",c);
    }
    for(int i=0;i<n;i++){
        printf("%c",c);
    }
    return 0;
}

 

17.計算日期差值

codeup網站最近故障,因此題目連接和截圖就沒了,我簡單描述一下本題的意思:

有多組測試數據,分別爲兩個日期,格式爲YYYYMMDD,計算兩個日期相差的天數

#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},
                {31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
    return ((year%4==0)&&(year%100!=0))||(year%400)==0;
}
int main(){
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    while(~scanf("%d%d",&time1,&time2)){
        if(time1>time2){
            int temp;
            temp=time1;
            time1=time2;
            time2=temp;
        }
        y1=time1/10000,m1=time1%10000/100,d1=time1%100;
        y2=time2/10000,m2=time2%10000/100,d2=time2%100;
        int count=1;
        while(y1!=y2||m1!=m2||d1!=d2){
            d1++;
            if(d1==month[m1][isLeap(y1)]+1){
                m1++;
                d1=1;
            }
            if(m1==13){
                y1++;
                m1=1;
            }
            count++;
        }
        printf("%d\n",count);
    }
    return 0;
}

 

18.換個格式輸出整數

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805318855278592

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    if(n>=0&&n<=9){
        for(int i=1;i<=n;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    if(n>=10&&n<=99){
        for(int i=1;i<=n/10;i++){
            printf("S");
        }
        for(int i=1;i<=n%10;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    if(n>=100&&n<=999){
        for(int i=1;i<=n/100;i++){
            printf("B");
        }
        for(int i=1;i<=n%100/10;i++){
            printf("S");
        }
        for(int i=1;i<=n%10;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    return 0;
}

 

19.進制轉換

我討厭進制轉換!我討厭進制轉換!我討厭進制轉換!

今天晚上就搞這一道題了,作完收工,哈哈。進制轉換是我不喜歡的一道題,跟計算機相關的考試好像不少都會牽涉到這個問題,誰讓計算機是01組成的呢。

 

對一個 P 進制的數,若是想要轉換爲 Q 進制,須要分兩步:

① 將 P 進制數 X 轉換爲 十進制 數 y。

#include<stdio.h>
int main(){
    int P;//P進制
    int x;//P進制數 x
    int y=0;//P進制數 x 轉換爲 十進制數 y
    int product=1;//product在循環中會不斷乘P,獲得1,P,P^2,P^3......
    scanf("%d%d",&P,&x);
    while(x!=0){
        y=y+(x%10)*product;
        x=x/10;
        product=product*P;
    }
    printf("%d\n",y);
    return 0;     
}

②將 十進制數 y 轉換爲 Q 進制數 z。

#include<stdio.h>
int main(){
    int y;//十進制的y 
    int Q;//Q進制 
    int z[40];//數組z存放Q進制數y的每一位 
    int num=0;//num爲位數
    scanf("%d%d",&y,&Q);
    do{
        z[num++]=y%Q;
        y=y/Q;
    } while(y!=0);
    for(int i=num-1;i>=0;i--){
        printf("%d",z[i]);
    }
    return 0;     
} 

 例題:D進制的A+B

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344

#include<stdio.h>
int main(){
    int A,B,y;
    int D;
    int z[40];
    int num=0;
    scanf("%d%d%d",&A,&B,&D);
    y=A+B;//十進制數y 
    do{
        z[num++]=y%D;
        y=y/D;
    } while(y!=0);
    for(int i=num-1;i>=0;i--){
        printf("%d",z[i]);
    }
    return 0;     
} 

 

20.判斷迴文字符串

#include<stdio.h>
#include<string.h>
int main(){
    char str[1000];
    scanf("%s",str);
    int len=strlen(str);
    int i=0;
    int j=len-1;
    while(i<=j){
        if(str[i]==str[j]){
            i++;
            j--;
        }
        else{
            printf("NO\n");
            break;
        }
    }
    if(i>j){
        printf("YES\n");
    } 
    return 0;
} 

 

21.說反話(二維字符數組的應用)

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805314941992960

單點測試:(while不會自動結束,須要按ctrl+Z)

#include<stdio.h>
#include<string.h>
char str[90][90];
int main(){
    int ans=0;
    while(~scanf("%s",str[ans])){
        ans++;
    } 
    for(int i=ans-1;i>=0;i--){
        printf("%s",str[i]);
        if(i>0) printf(" ");
    }
    return 0;
} 

多點測試:

#include<stdio.h>
#include<string.h>
int main(){
    char str[90];
    gets(str);
    int len=strlen(str);
    int r=0,h=0;//行和列
    char ans[90][90];
    for(int i=0;i<len;i++){
        if(str[i]!=' '){
            ans[r][h++]=str[i];//單詞存儲中...... 
        }else{
            ans[r][h]='\0';//一個單詞存儲完畢
            r++;//開始存儲下一個;
            h=0; 
        }
    } 
    for(int i=r;i>=0;i--){
        printf("%s",ans[i]);
        if(i>0) printf(" ");
    } 
    return 0;
} 

 

22.我要經過(PATB1003)

題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

額~題目至關晦澀難懂,我簡單描述一下吧

1.字符串中只能包含‘P’,‘A’,‘T’這三種字符

2.只能有一個‘P’和一個‘T’,P必定在T以前,且P和T之間必定有A

3.P以前的A的個數 * P和T之間A的個數 = T以後A的個數

同時知足以上三個條件,輸出YES,不然輸出NO

思路參考:https://blog.csdn.net/whl_program/article/details/76652890

#include<stdio.h>
#include<string.h>
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        char s[110];
        scanf("%s",s);
        int len=strlen(s);
        int num_a=0;
        int p,t;
        for(int i=0;i<len;i++){
            if(s[i]=='A')
                num_a++;
            if(s[i]=='P')
                p=i;
            if(s[i]=='T')
                t=i;
        }
        int flag=1;
        if(num_a!=len-2) flag=-1;
        if(p>t||t==p+1) flag=-1;
        if((p*(t-p-1)) != (len-1-t)) flag=-1;
        if(flag==1){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

 

23.字符串拼接去重(PAT B1093)

解題思路:

1.字符串拼接

2.用一個int數組記錄字母是否輸出過,達到去重效果

字符串拼接方法(上一篇-語言篇中有介紹):

#include<stdio.h>
#include<string.h>
char stra[3000000];
char strb[1000010];
int c[1000];
int main(){
    for(int i=0;i<500;i++){
        c[i]=0;
    }
    gets(stra);
    gets(strb);
    strcat(stra,strb);    
    int len=strlen(stra);
    for(int i=0;i<len;i++){
        int k=stra[i];
        if(c[k]==0){
            putchar(stra[i]);
            c[k]=1;
        }
    }
    printf("\n");
    return 0;
} 

 

從此有合適的題目我還會持續更新本帖,歡迎你們學習交流。

相關文章
相關標籤/搜索