2018拼多多算法岗7-22笔试第一二三题
答案来自于网络
第一题:leetcode原题数组中的最长山脉
class Solution {
public:
int longestMountain(vector<int>& A) {
int tmp_len = 0;
int data_len = A.size();
int begin, end;
if (data_len < 3)
return tmp_len;
else
for (int i = 1; i < data_len - 1; i++)
{
begin = i;
while (begin > 0 && A[begin - 1] < A[begin])
begin--;
end = i;
while (end < data_len - 1 && A[end + 1] < A[end])
end++;
if (begin < i && end > i)
tmp_len = max(tmp_len, end - begin + 1);
}
return tmp_len >= 3? tmp_len:0;
}
};
大于号改成小于号就ok
public:
int longestMountain(vector<int>& A) {
int tmp_len = 0;
int data_len = A.size();
int begin, end;
if (data_len < 3)
return tmp_len;
else
for (int i = 1; i < data_len - 1; i++)
{
begin = i;
while (begin > 0 && A[begin - 1] < A[begin])
begin--;
end = i;
while (end < data_len - 1 && A[end + 1] < A[end])
end++;
if (begin < i && end > i)
tmp_len = max(tmp_len, end - begin + 1);
}
return tmp_len >= 3? tmp_len:0;
}
};
大于号改成小于号就ok
第二题:网络原题周期字符串
# include <cstdio>
# include <iostream>
# include <string>
using namespace std;
int main()
{
string str;
cin >> str;
for (size_t i = 0; i < str.size(); ++i)
{
string sub = str.substr(0, i + 1);
int k = sub.size();
if (str.size() % k)
continue;
string subcmp = str.substr(0, i + 1);
int cnt = 1;
while (sub == subcmp) {
int tmp = k * cnt;
subcmp = str.substr(k * cnt++, i + 1);
}
if (subcmp.empty()) {
cout << str.substr(0, k) << endl;
break;
}
}
return 0;
}
第三题:leetcode原题到达终点数字
# include <iostream>
# include <string>
using namespace std;
int main()
{
string str;
cin >> str;
for (size_t i = 0; i < str.size(); ++i)
{
string sub = str.substr(0, i + 1);
int k = sub.size();
if (str.size() % k)
continue;
string subcmp = str.substr(0, i + 1);
int cnt = 1;
while (sub == subcmp) {
int tmp = k * cnt;
subcmp = str.substr(k * cnt++, i + 1);
}
if (subcmp.empty()) {
cout << str.substr(0, k) << endl;
break;
}
}
return 0;
}
第三题:leetcode原题到达终点数字
#include<iostream>
#include<vector>
using namespace std;
int reachNumber(int target) {
if (target<0) return reachNumber(-target);
int i = 0;
while (i*(i + 1) < 2 * target)
{
i++;
}
if (i*(i + 1) / 2 == target)
return i;
else
{
if ((i*(i + 1) / 2 - target) % 2 == 0)
return i;
else
{
if (i % 2 == 0)
return i + 1;
else
return i + 2;
}
}
}
int main()
{
int target;
cin >> target;
int result = reachNumber(target);
cout << result << endl;
return 0;
}
#include<vector>
using namespace std;
int reachNumber(int target) {
if (target<0) return reachNumber(-target);
int i = 0;
while (i*(i + 1) < 2 * target)
{
i++;
}
if (i*(i + 1) / 2 == target)
return i;
else
{
if ((i*(i + 1) / 2 - target) % 2 == 0)
return i;
else
{
if (i % 2 == 0)
return i + 1;
else
return i + 2;
}
}
}
int main()
{
int target;
cin >> target;
int result = reachNumber(target);
cout << result << endl;
return 0;
}