2018內推網易測試工程師程式設計3題
1.題目描述
【第一題】如果一個01串任意兩個相鄰的位置的字元都是不一樣的,我們就叫這個01串為交錯01串。例如,“1”,“10101”,“0101010”都是交錯01串。
小易現在有一個01串s,小易想找出一個最長的連續子串,並且這個子串是一個交錯01串。小易需要你幫忙求出最長的這樣的子串的長度是多少。
輸入描述:輸入包括字串s,s的長度length(1 <= length <= 50), 字串中只包含‘0’和‘1’。
輸出描述:輸出一個整數,表示最長的滿足要求的子串長度。
示例1:
輸入 10101011110
輸出 7
解題思路:動態規劃 與lintcode的最長上升連續子序列思想類似
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin>>s;
if(s.empty())
{
return 0;
}
int len=s.size();
vector<int>b(len,1);
for(int i=0;i<len-1;i++)
{
if(s[i]!=s[i+1])
{
b[i+1 ]=b[i]+1;
}
}
int m=*max_element(b.begin(),b.end());
cout<<m<<endl;
return 0;
}
拓展題目:給定一個整數陣列(下標從 0 到 n-1, n 表示整個陣列的規模),請找出該陣列中的最長上升連續子序列。(最長上升連續子序列可以定義為從右到左或從左到右的序列。)
給定 [5, 4, 2, 1, 3], 其最長上升連續子序列(LICS)為 [5, 4, 2, 1], 返回 4.
給定 [5, 1, 2, 3, 4], 其最長上升連續子序列(LICS)為 [1, 2, 3, 4], 返回 4.
class Solution {
public:
/**
* @param A an array of Integer
* @return an integer
*/
int longestIncreasingContinuousSubsequence(vector<int>& A) {
if(A.empty())
{
return 0;
}
int len=A.size();
vector<int>bl(len,1);
for(int i=0;i<len-1;i++)
{
if(A[i]<A[i+1])
{
bl[i+1]=bl[i]+1;
}
}
vector<int>bh(len,1);
for(int i=len-1;i>=0;i--)
{
if(A[i-1]>A[i])
{
bh[i-1]=bh[i]+1;
}
}
return max(*max_element(bl.begin(),bl.end()),*max_element(bh.begin(),bh.end()));// Write your code here
}
};
2.題目描述
【第二題】如果一個數列S滿足對於所有的合法的i,都有S[i + 1] = S[i] + d,這裡的d也可以是負數和零,我們就稱數列S為等差數列。
小易現在有一個長度為n的數列x,小易想把x變為一個等差數列。小易允許在數列上做交換任意兩個位置的數值的操作,並且交換操作允許交換多次。但是有些數列通過交換還是不能變為等差數列,小易需要判別一個數列是否能通過交換操作變成等差數列。
輸入描述:輸入包括兩行,第一行包含整數n(2 <= n <= 50),即數列的長度。第二行n個元素x[i](0 <= x[i] <= 1000),即數列中的每個整數。
輸出描述:如果可以變成等差數列輸出“Possible”,否則輸出“Impossible”。
示例1:
輸入 3
3 1 2
輸出 Possible
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int count;
cin>>count;
vector<int>num(count,0);
int m=0;
for(int k=0;k<num.size();k++)
{
cin>>num[k];
}
sort(num.begin(),num.end());
int diff=num[1]-num[0];
for(int i=0;i<num.size()-1;i++)
{
if(num[i+1]-num[i]==diff)
{
m++;
}
}
if(m==num.size()-1)
{
cout<<"Possible"<<endl;
}
else
{
cout<<"Impossible"<<endl;
}
return 0;
}
3.題目描述
【第三題】小易為了向他的父母變現他已經長大獨立了,他決定搬出去自己居住一段時間。一個人生活增加了許多花費。小易每天必須吃一個水果並且需要每天支付x元的房屋租金。當前小易手中已經有f個水果和d元錢,小易也能去商店購買一些水果,商店每個水果售賣p元。小易為了表現他獨立生活的能力,希望能獨立生活的時間越長越好,小易以往你來幫他計算一下他最多能獨立生活多少天。
輸入描述:輸入包括一行,四個整數x,f,d,p(1 <= x, d, f, p <= 2 * 10^9),以空格分割。
輸出描述:輸出一個整數,表示小易最多能獨立生活多少天。
示例1:
輸入 3 5 100 10
輸出 11
#include<iostream>
using namespace std;
int main()
{
long int x,f,d,p;
cin>>x>>f>>d>>p;
int sy=d-f*x;
int day=0;
if(sy<=0)
{
day=d/x;
}
else
{
day=f+sy/(x+p);
}
cout<<day<<endl;
return 0;
}