順豐筆試8月29日

tanch25發表於2024-08-29

第一題:字串轉化

字串的駝峰表示法僅將除第一個單詞外的單詞首字母大小,例如:myName。而下劃線表示法中所有單詞小寫,但是會用下劃線隔開,例如my_name。給出n個字串,若是駝峰表示法,將其轉化為下劃線表示法輸出,若是下劃線表示法則直接輸出,否則輸出"indistinct";

#include<bits/stdc++.h>  
using namespace std;  
int main() {  
    int n;  
    cin >> n;  
    string s;  
    for (int i = 0; i < n; i++) {  
        cin >> s;  
        if ((s[0] >= 'A' && s[0] <= 'Z') || s[0] == '_'){  
            cout << "indistinct"<<endl;  
            continue;  
        }  
        string res;  
        bool camel = false;  
        bool down = false;  
        bool next = false;  
        for (char c:s) {  
            if (c >= 'A' && c <= 'Z') {  
                char nc = c + 32;  
                res = res + '_' + nc;  
                camel = true;  
                continue;  
            }  
            if (c =='_') {  
                if (next) {  
                    camel = true;  
                }  
                down = true;  
                next = true;  
            }  
            else next = false;  
            res = res + c;  
        }  
        if ((camel && down) || next ) cout << "indistinct"<<endl;  
        else cout << res << endl;  
    }  
    return 0;  
}

需要排除_開頭結尾、大寫字母開頭和連續下劃線的特殊情況

第二題:排列房子

小島上有n(n <= 15)間房子,每間房子都有著對應的價值,要求相鄰兩個房子的價值一定為整數倍(例如房子1的價值是2的倍數或房子2價值為1的倍數),請問有多少種排列

#include<bits/stdc++.h>  
using namespace std;  
int main() {  
    int n;  
    cin >> n;  
    int h[18];  
    for (int i = 0; i < n; i++) {  
        cin >> h[i];  
    }  
    //使用狀態壓縮表示排布方法  
    // dp[i][j] i表示當前集合,j表示前一個房子  
    int dp[100005][15];  
    memset(dp, 0, sizeof(dp));  
    for (int i = 0; i < n; i++) {  
        int s = (1 << i);  
        dp[s][i] = 1;  
    }  
    for (int i = 1; i < (1 << n); i++) {  
        for (int j = 0; j < n; j++) {  
            if (i & (1 << j)) {  
                //列舉的dp[i][j]存在則找 dp[i - j][k],k則是與j滿足條件的房子  
                for (int k = 0; k < n; k++) {  
                    if (((1 << k) & (i ^ (1 << j))) && (h[j] % h[k] == 0 || h[k] % h[j] == 0)) {  
                        dp[i][j] += dp[i ^ (1 << j)][k];  
                    }  
                }  
            }  
        }  
    }  
    int res = 0;  
    for (int i = 0; i < n; i++) {  
        res += dp[(1 << n) - 1][i];  
    }  
    cout << res;  
    return 0;  
}

相關文章