1. 程式人生 > >2018內推網易測試工程師程式設計3題

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;
}