banner
cos

cos

愿热情永存,愿热爱不灭,愿生活无憾
github
tg_channel
bilibili

2022年の春の360の筆記試験問題の復習-開発E巻

360 笔试题目复盘 - 研发 E 卷,前端開発のテスト問題、選択問題 30 問とプログラミング問題 2 問を含む。

選択問題(30 問)#

データベース、高等数学、方程式など、すべての問題が出題されます。後半は主にフロントエンドの問題です。

プログラミング問題 - 1 強いパスワードの検証(簡易版)#

要件は次のとおりです。

  • パスワードの長さは 8 文字以上であること
  • 数字、大文字、小文字、特殊文字(いずれか 1 つ)が含まれていること

入力例

12_Aaqq12
Password123
PASSWORD_123
PaSS^word
12_Aaqq

出力例

Ok
Irregular password
Irregular password
Irregular password
Irregular password

アイデア#

JavaScript の場合、正規表現を使用して簡単に解決できますが、私は正規表現が苦手です。1 回のループで判定するだけで問題ありません。非常にシンプルで直接的です(子供たちは真似しないでください)。

コード#

#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string str;
bool judge(string s) {
    int len = s.length();
    if(len < 8) return false;
    bool flag[4];   // 数字、大文字、小文字、特殊文字
    memset(flag, false, sizeof(flag));
    int cnt = 0;
    for(int i = 0; i < len; ++i) {
        if(s[i] >= 'A' && s[i] <= 'Z') {
            if(!flag[0]) {
                flag[0] = true;
                ++cnt;
            }
        } else if(s[i] >= 'a' && s[i] <= 'z') {
            if(!flag[1]) {
                flag[1] = true;
                ++cnt;
            }
        } else if(s[i] >= '0' && s[i] <= '9') {
            if(!flag[2]) {
                flag[2] = true;
                ++cnt;
            }
        } else if(!flag[3]) {   // 特殊文字
            flag[3] = true;
            ++cnt;
        }
        if(cnt == 4) return true;
    }
    return false;
}
int main() {
    while(cin >> str) {
        if(judge(str)) cout << "Ok" << endl;
        else cout << "Irregular password" << endl;
    }
    return 0;
}

プログラミング問題 - 2 積み重ねた荷物(Web)#

元の RCL の荷物が長方形に積み重ねられ、盗まれた結果、(R-2)(C-1)(L-2) の長方形になりました。
現在の荷物の総数から、最悪の場合に盗まれた荷物の量を計算し、その最悪の値を出力します。

入力説明
入力は n という数値で、(R-2)(C-1)(L-2) を表します。

出力説明
盗まれた荷物の量を表す数値を出力します。

入力例

4

出力例

41

ヒント
100% のデータに対して:1 ≤ n ≤ 10^9
例の説明:R=3,C=5,L=3, 3*5 * 3-(3-2)*(5-1)*(3-2)=41

分析#

3 2 3 = 18
1 1 1 = 1
17 個盗まれた
4 2 5 = 40
2 1 3 = 6
34 個盗まれた

3 つの長方形を盗む 盗まれた体積は1*(R+2)*(L+2)+ 2*R*C +2*(R+2)*C
(おそらく数学的に導き出すことができると思いますが、私は力ずくで解いて枝刈りをして AC しました)
私の力ずくの解法:r、l、c を盗んだ後の長さ、幅、高さとし、R = r+2, L = l+2, C = c+1 とします。明らかに rcl は n の約数でなければなりません。n を素因数分解してすべての素因数を m に保存し、m を走査して各 r、l、c を取得し、途中で枝刈りを行います。現在の 2 つの数の積が n を超えた場合はスキップします。

コード#

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
int n;
ll ans;
vector<ll> m;
int main() {
    cin >> n;
    int k = sqrt(n);
    for(int i = 1; i <= k; ++i) {  
        if(n % i == 0) {
            m.push_back(i);
            m.push_back(n/i);
        }
    }
    sort(m.begin(), m.end());
    int len = m.size();
    for(int r = 0; r < len; ++r) {
        for(int l = 0; l < len; ++l) {
            ll t = m[r]*m[l];
            if(t > n) continue; // 枝刈り
            for(int c = 0; c < len; ++c) {
                ll nown = t*m[c];
                if(nown != n) continue;
                ll R = m[r]+2;
                ll L = m[l]+1;
                ll C = m[c]+2;
                ll stole = ll(R*L*C) - nown;
                ans = max(ans, stole);
            }
        }
    }
    cout << ans << endl;
    return 0;
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。