華為機試験プログラミング試験問題1

23203 ワード

1.文字列の接続最長パス検索
タイトルは、指定されたn文字列を記述します.n文字列を辞書順に並べてください.入力説明:第1の動作の正の整数n(1≦n≦1000)を入力し、以下のn動作のn文字列(文字列長≦100)を入力し、文字列には大文字と小文字しか含まれていない.出力記述:データ出力n行、出力結果は辞書順に並ぶ文字列.例1入力9 cap to cat card two too up boat boot出力boat boot cap card cat to too two up
#include 
#include 
#include 
using namespace std;
bool comp(string strA, string strB){
    return strA < strB;
}
int main(){
    int n;
    while(cin>>n){
        string strArray[1000];
        if(n>=1 && n<=1000)
            for(int i=0;i<n;i++){
                cin>>strArray[i];
            }
        sort(strArray, strArray+n, comp);
        for(int i=0; i<n; i++){
            cout<<strArray[i]<<endl;
        }
    }
    
    return 0;
}

2.簡単なパスワード解読
テーマの説明のパスワードは私たちの生活の中でとても重要なもので、私たちのそんな少しも言えない秘密はすべてそれに頼っています.わあははは.次に淵子はパスワードの上にパスワードを追加しなければならない.簡単だが安全だ.
もし淵子の元のBBSのパスワードがzvbo 9441987だったとしたら、記憶を便利にするために、彼はアルゴリズムを通じてこのパスワードをYUANzhi 1987に変換した.このパスワードは彼の名前と生年で、どのように忘れても忘れられないし、人目につく場所に置いて本当のパスワードを知られないことができる.
彼はこのように変換して、みんなはすべて携帯電話の上のアルファベットを知っています:1–1、abc–2、def–3、ghi–4、jkl–5、mno–6、pqrs–7、tuv–8 wxyz–9、0–0、このように簡単で、淵子はパスワードの中で現れた小文字のアルファベットをすべて対応する数字に変えて、数字とその他の記号はすべて変換しません.
声明:パスワードにはスペースがありませんが、パスワードに出てくる大文字は小文字になってから1つ後ろに移動します.例えば、X、まず小文字になってから、もう1つ後ろに移動します.yではありませんか.簡単でしょう.覚えておいて、zが後ろに移動するのはaですよ.
入力説明:入力には複数のテストデータが含まれます.入力は1つの明文で、パスワードの長さは100文字を超えないで、ファイルの終わりまで入力します
出力記述:出力淵子の真の密文
例1入力YUANzhi 1987出力zvbo 9441987
#include 
using namespace std;
int main(){
    string str;
    char pw[101];
    int i;
    while(cin>>str){
        if(str.size()==0||str.size()>100)
            break;
        for(i=0;i<str.size();i++){
            if(str[i]>='A'&&str[i]<='Z'){
                if(str[i]=='Z')
                    pw[i]='a';
                else
                    pw[i]=str[i]+32+1;//          
            }else if(str[i]>='a'&&str[i]<='z'){
                if(str[i]=='a'||str[i]=='b'||str[i]=='c') pw[i]='2';
                else if(str[i]=='d'||str[i]=='e'||str[i]=='f') pw[i]='3';
                else if(str[i]=='g'||str[i]=='h'||str[i]=='i') pw[i]='4';
                else if(str[i]=='j'||str[i]=='k'||str[i]=='l') pw[i]='5';
                else if(str[i]=='m'||str[i]=='n'||str[i]=='o') pw[i]='6';
                else if(str[i]=='p'||str[i]=='q'||str[i]=='r'||str[i]=='s') pw[i]='7';
                else if(str[i]=='t'||str[i]=='u'||str[i]=='v') pw[i]='8';
                else 
                    pw[i]='9';
            }else
                pw[i]=str[i];
        }
        pw[i]='\0';
        cout<<pw<<endl;
    }
    return 0;
}

3.サイダーボトル
ある店では、3つの空きペットボトルを1本のサイダーに変えることができると規定されています.張さんは手に10本の空きペットボトルを持っていますが、彼女はせいぜい何本のサイダーに変えて飲むことができますか.答えは5本で、方法は以下の通りです:まず9つの空き瓶で3本のサイダーを交換して、3本の満タンを飲んで、飲んでから4つの空き瓶を飲んで、3つでもう1本交換して、この満タンを飲んで、この時2つの空き瓶が残っています.それから、社長にまずサイダーを貸してもらい、この瓶をいっぱい飲んで、飲んでから3つの空き瓶でいっぱいのものを交換して社長に返します.もし張さんの手にn個の空き缶があれば、せいぜい何本のサイダーに変えて飲むことができますか?入力説明:入力ファイルには最大10組のテストデータが含まれており、各データは1行を占め、正の整数n(1<=n<=100)のみが含まれており、張さんが手に持っている空きペットボトルの数を示している.n=0は入力が終了したことを示し、あなたのプログラムはこの行を処理すべきではありません.
出力説明:各テストデータについて、最大飲めるサイダーボトル数を示す1行を出力します.1本も飲めない場合は、0を出力します.
例1入力3 10 81 0出力1 5 40
#include 
using namespace std;
int eat(int n){
    if(n<1&&n>100)
        return -1;
    int full=0,empty=n+1;//   1 , empty      +1;
    while(empty/3!=0){
        full+=empty/3;
        empty=empty%3+empty/3;
    }
    return full;
}
int main(){
    int result[10]={0};
    int n;
    int i=0;
    while(cin>>n){
        result[i]=eat(n);
        i++;
    }
    for(int j=0;j<i;j++){
        cout<<result[j]<<endl;
    }
    return 0;
}

問題3のペットボトルに鑑みて、数学の分析を経てサイダーを飲むことができるボトル数が原始の空きボトル数の1/2であるという解法が独特である.すなわち、元の空き瓶数が整数nである場合.では、飲んだ瓶の数は(int)n/2です.ははは、どうせ私はこのような方法を思いつかないで、深く感心します.
解法は必ずしも最良とは限らないが、牛客ネット上で運行されている.私は初めてcodingを試して、任重道遠です.より良い解法を共有するメッセージを歓迎します.ありがとうございます.