愛奇藝2018秋季校招算法工程師(第一場)
阿新 • • 發佈:2017-12-20
空串 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秋季校招算法工程師(第一場)