1. 程式人生 > >愛奇藝2018秋季校招算法工程師(第一場)

愛奇藝2018秋季校招算法工程師(第一場)

空串 ring != push 所有 ios urn 需要 rmi

  • 歡迎fork and star:Nowcoder-Repository-github

括號匹配深度

  • 題目:
鏈接:https://www.nowcoder.com/questionTerminal/a2d5b1875bb0408384278f40d1f236c9
來源:牛客網

一個合法的括號匹配序列有以下定義:
1、空串""是一個合法的括號匹配序列
2、如果"X"和"Y"都是合法的括號匹配序列,"XY"也是一個合法的括號匹配序列
3、如果"X"是一個合法的括號匹配序列,那麽"(X)"也是一個合法的括號匹配序列
4、每個合法的括號序列都可以由以上規則生成。
例如: "","()","()()","((()))"都是合法的括號序列
對於一個合法的括號序列我們又有以下定義它的深度:
1、空串""的深度是0
2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那麽字符串"XY"的深度為max(x,y) 3、如果"X"的深度是x,那麽字符串"(X)"的深度是x+1
例如: "()()()"的深度是1,"((()))"的深度是3。牛牛現在給你一個合法的括號序列,需要你計算出其深度。
輸入描述:

輸入包括一個合法的括號序列s,s長度length(2 ≤ length ≤ 50),序列中只包含'('和')'。



輸出描述:

輸出一個正整數,即這個序列的深度。

示例1
輸入

(())

輸出

2
  • 解答:
#include<iostream>

using namespace std;

#include <string>
#include <stack>

//測試用例:
//( (()) () ) ( ( (()) (()) )() )
//
//對應輸出應該為 :
//
//      4
//
//  你的輸出為 :
//
//      7

int main()  //60%
{
    string str;
    stack<char> sta;
    cin >> str;

    int depth = 0;
    int result_depth = 0
; for (int i = 0; i < str.size();i++) { if (sta.empty()) { depth = 0; } if (str[i]=='(') { sta.push(str[i]); depth += 1; } else { sta.pop(); } result_depth = (result_depth>depth) ? result_depth : depth; } cout << result_depth << endl; return
0; } - 認真想其實思路很簡單 int main() { string str; stack<char> sta; cin >> str; int depth = 0; int result_depth = 0; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') { sta.push(str[i]); depth += 1; } else { depth -= 1; } result_depth = (result_depth > depth) ? result_depth : depth; } cout << result_depth << endl; return 0; }

奶牛編號

  • 題目:
鏈接:https://www.nowcoder.com/questionTerminal/c167db5218e54ef2870aebe5b14743f2
來源:牛客網

牛牛養了n只奶牛,牛牛想給每只奶牛編號,這樣就可以輕而易舉地分辨它們了。 每個奶牛對於數字都有自己的喜好,第i只奶牛想要一個1和x[i]之間的整數(其中包含1和x[i])。
牛牛需要滿足所有奶牛的喜好,請幫助牛牛計算牛牛有多少種給奶牛編號的方法,輸出符合要求的編號方法總數。
輸入描述:

輸入包括兩行,第一行一個整數n(1 ≤ n ≤ 50),表示奶牛的數量 第二行為n個整數x[i](1 ≤ x[i] ≤ 1000)



輸出描述:

輸出一個整數,表示牛牛在滿足所有奶牛的喜好上編號的方法數。因為答案可能很大,輸出方法數對1,000,000,007的模。

示例1
輸入

4
4 4 4 4

輸出

24
  • 這道題沒有理解
  • 參考link

平方串

  • 題目
鏈接:https://www.nowcoder.com/questionTerminal/b43fb39898f448e39adbcffde5ff0dfc
來源:牛客網

如果一個字符串S是由兩個字符串T連接而成,即S = T + T, 我們就稱S叫做平方串,例如"","aabaab","xxxx"都是平方串.
牛牛現在有一個字符串s,請你幫助牛牛從s中移除盡量少的字符,讓剩下的字符串是一個平方串。換句話說,就是找出s的最長子序列並且這個子序列構成一個平方串。
輸入描述:

輸入一個字符串s,字符串長度length(1 ≤ length ≤ 50),字符串只包括小寫字符。



輸出描述:

輸出一個正整數,即滿足要求的平方串的長度。

示例1
輸入

frankfurt

輸出

4
  • 解答主要是將問題化簡為求公共最長子序列
//平方串
#include<iostream>

using namespace std;

#include <string>

#define max(a,b)    (((a) > (b)) ? (a) : (b))


//測試用例:
//fjkjsakljflkjakljjfiwoqjfioq wfoiqwjfiojq
//
//對應輸出應該為 :
//
//16
//
//你的輸出為 :
//
//    18


int findMaxCom(string a_, string b_)
{
    int dp[51][51] = { 0 };
    int ret = 0;

    for (int i = 1; i <= a_.size();i++)
    {
        for (int j = 1; j <= b_.size();j++)
        {
            if (a_[i-1]==b_[j-1])  //(a_[i]==b_[j] 這個bug花了很多時間
            {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            else
            {
                dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }

            //ret = (ret > dp[i][j]) ? ret : dp[i][j];
        }
    }
    ret=dp[a_.size()][b_.size()];

    return ret;
}

int main()
{
    string str;
    char temp[50];
    //cin >> str;

    FILE* fp = fopen("input.txt", "r+");

    if (fp!=NULL)
    {
        fgets(temp,128, fp);
        str = temp;
    }


    int ret = 0;
    string a,b;
    for (int i = 0; i < str.size(); i++)
    {
        a = str.substr(0, i), b = str.substr(i, str.size()-i);

        if (i ==28)
        {
            int stop = 0;
        }
        int max_com_len = findMaxCom(a,b);

        ret = ret>max_com_len ? ret : max_com_len;
    }

    cout << ret * 2 << endl;
    return 0;
}

愛奇藝2018秋季校招算法工程師(第一場)