腾讯笔试编程题,真难!

1、AC
string s;
while(cin>>s){
    stack<char> sk;
    string ans;
    for(int i = 0; i < s.size(); i++){
        if(sk.empty() && s[i] != '[')ans.push_back(s[i]);
        else{
            if(s[i] == ']'){
                string temp;
                while(sk.top()!= '|'){
                    temp.push_back(sk.top());
                    sk.pop();
                }
                sk.pop();// remove '|'
                reverse(temp.begin(),temp.end());
                string num;
                while(sk.top()!='['){
                    num.push_back(sk.top());
                    sk.pop();
                }
                reverse(num.begin(),num.end());
                int len = atoi(num.c_str());
                string t;
                for(int i = 0; i < len; i++) t += temp;
                sk.pop();// remove '['

                if(sk.empty())
                    ans += t;
                else 
                    for(int i = 0; i < t.size(); i++)sk.push(t[i]);
            }else{
                sk.push(s[i]);
            }
        }

    }
    cout <<  ans << endl;
}
2、超时,思想是归并排序,就是这题浪费太多时间了
void mergeSort(vector<int>& q, vector<int>& tmp, int l, int r, long long& ans)
{
    if (l >= r) return;

    int mid = l + (r - l) / 2;

    mergeSort(q, tmp, l, mid, ans);
    mergeSort(q, tmp, mid + 1, r, ans);

    int k = 0, i = l, j = mid + 1;

    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];//前一个数比后一个数小
    //后一个数比前一个数大 把前面的数对 都加到ans
    else tmp[k ++ ] = q[j ++ ],ans += mid - i + 1;
    //合并比较长的数组的那一部分
    while (i <= mid) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];

    //把数据放到temp数组中
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

int InversePairs(vector<int> &nums) {
    int len = nums.size();
    vector<int> tmp(len, 0);
    long long ans = 0;
    mergeSort(nums, tmp, 0, (int)nums.size() - 1, ans);
    return ans;
}
int main()
{
    int n;
    while(cin >> n){
        long long len = (long long)pow(2,n);
        vector<int> nums(len);
        for(int i = 0; i < len; i++)cin>>nums[i];
        int m;
        cin>>m;
        vector<int> ms;
        int ll = 0;
        for(int i = 0; i < m; i++){
            int t;
            cin>>t;
            t = (int)ceil(pow(2,t));
            auto itstart = nums.begin(), itend = nums.begin();
            while(itend != nums.end()){
                for(int j = 0; j < t; j++){
                    if(itend!=nums.end())
                        itend++;
                }
                reverse(itstart, itend);
                itstart = itend;
            }
            //for(auto x : nums)cout << x << endl;
            ms.push_back(InversePairs(nums));
        }
        for(auto x : ms)cout << x << endl;
       
    }
    return 0;
}
3、直接在白板上写的 通过60%,超时,没有保存代码
4、直接在白板上写的 通过50,超时,没有保存代码,大概是找左右相邻的数,然后分别往左边和右边遍历,每次遍历如果有比当前的高的cnt++并更新当前的高度。
5、codeforces 第689A,可以参考,没有调出
真的难啊!!!


#腾讯##笔试题目##题解#
全部评论

相关推荐

点赞 10 评论
分享
牛客网
牛客企业服务