#45068: C++超簡易解


812034alex@gmail.com (薛宇峻)

學校 : 不指定學校
編號 : 255754
來源 : [1.200.247.176]
最後登入時間 :
2025-01-05 20:11:16
q182. 2. 字串操作 -- 2025年1月APCS | From: [1.200.247.176] | 發表日期 : 2025-01-05 20:55

這份程式碼上傳已經AC,如有錯誤請不吝指正。

這是我考完試之後自己又重寫了一次的程式碼,註解處的等價寫法即為我原本的寫法,只是後來我發現有更好的解,因此做了一些修改。
#include<bits/stdc++.h>
using namespace std;
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);//加速輸入
    string s;
    cin >> s;
    int n,len=s.size();//字串長度
    cin >> n;
    while(n--){
        int x;
        cin >> x;
        if(x==0){
            for(int i=0;i+1<len;i+=2){//每隔兩個交換一次
                swap(s[i],s[i+1]);
            }
        }
        else if(x==1){
            for(int i=0;i+1<len;i+=2){//每隔兩個判斷是否需要交換
                if(s[i] > s[i+1]) {//直接隱性轉型比較大小
                    swap(s[i],s[i+1]);
                }
            }
        }
        else if(x==2) {
            string head = s.substr(0,len/2), bottom = s.substr(len/2);//head為前半部分,這份程式碼船已經AC,如有錯誤請不吝指正。

 

這是我考完試之後自己又重寫了一次,註解處的等價寫法即為我原本的寫法,只是後來發現有更好的寫法,因此做了一些修改。

#include<bits/stdc++.h>

using namespace std;

int main() {

    cin.tie(0);

    ios_base::sync_with_stdio(0);//加速輸入

    string s;

    cin >> s;

    int n,len=s.size();//字串長度

    cin >> n;

    while(n--){

        int x;

        cin >> x;

        if(x==0){

            for(int i=0;i+1<len;i+=2){//每隔兩個交換一次

                swap(s[i],s[i+1]);

            }

        }

        else if(x==1){

            for(int i=0;i+1<len;i+=2){//每隔兩個判斷是否需要交換

                if(s[i] > s[i+1]) {//直接隱性轉型比較大小

                    swap(s[i],s[i+1]);

                }

            }

        }

        else if(x==2) {

            string head = s.substr(0,len/2), bottom = s.substr(len/2);//head為前半部分,bottom為後半部分
            /*
            substr操作等價於下面這段程式:
            string head,bottom;
            for(int i=0;i<len/2;i++){
                head+=s[i];
            }
            for(int j=len/2;j<len;j++){
                bottom+=s[j];
            }
            */
            for (int i=0;i<len;i++) {
                s[i] = (i%2==0) ? head[i/2] : bottom[i/2];//利用三元運算子和整數除法交叉加入原本字串
                /*
                等價於下面操作:
                int cnt1=0,cnt2=0;
                for(int i=0;i<len;i++){
                    if(i%2==0){
                        s[i] = head[cnt1];
                        cnt1++;
                    }
                    if(i%2==1){
                        s[i] = bottom[cnt2];
                        cnt2++;
                    }
                }
                */
            }
        }
    }
    cout << s << '\n';//輸出最終結果
    return 0;
}

 
ZeroJudge Forum