1. 程式人生 > >順豐科技 2019校園招聘筆試程式設計題-2018.09.15

順豐科技 2019校園招聘筆試程式設計題-2018.09.15

1
1-2.png
1-3.png
這道題 63%通過率,沒找到AC程式碼,先記錄一下
堆排序,63%程式碼:

#include <bits/stdc++.h>

using namespace std;

void maxheap_down(vector<int> &arr, int start, int end){
    int c = start;            // 當前(current)節點的位置
    int left = 2*c + 1;        // 左(left)孩子的位置
    int tmp = arr[c];            // 當前(current)節點的大小
for (; left <= end; c=left,left=2*left+1){ // "left"是左孩子,"left+1"是右孩子 if ( left < end && arr[left] < arr[left+1])// 左右兩孩子中選擇較大者,即heap[left+1] left++; if (tmp >= arr[left]) break; // 調整結束 else // 交換值 { arr[c] = arr[left]; arr[left]= tmp; } } } /* * 堆排序(大根堆) * 引數說明: * a -- 待排序的陣列 * n -- 陣列的長度 */
void heap_sort(vector<int> &arr, int n){ // 從(n/2-1) --> 0逐次遍歷。遍歷之後,得到的陣列實際上是一個(最大)二叉堆。 for (int i = n / 2 - 1; i >= 0; i--) maxheap_down(arr, i, n-1); } string str; int main() { cin >> str; vector<int> arr; if(str == "") return 0; int x1 = 0
; int x2 = 0; int int_temp; string stemp; while (true){ x2 = str.find(',', x1);//返回首次匹配的逗號的下標 if(x2 == -1) break; stemp = str.substr(x1, x2 - x1);//擷取從字串str中第x1位開始的長度為(x2-x1)的字串 int_temp = atoi(stemp.c_str()); arr.push_back(int_temp); x1 = x2 + 1;//更改下次查詢起始位置 } stemp = str.substr(x1, str.size()-x1); int_temp = atoi(stemp.c_str()); arr.push_back(int_temp); if(arr.size() == 1){ cout << arr[0]; return 0; } heap_sort(arr, arr.size()); for(int i=0; i<arr.size()-1; i++) cout << arr[i] << ','; cout << arr[arr.size()-1] << endl; return 0; } //4,1,3,2,16,9,10,14,8,7

2-1.png
2-2.png
題目中取1~n個,我只寫了取一個或者兩個。。。。。。
83%通過率

#include <bits/stdc++.h>

using namespace std;
int sum;
string str;

int countOfSum(vector<int> arr, int sum){
    int left = 0;
    int right = arr.size()-1;
    int res = 0;
    if(arr.size()==1 && arr[0]==sum)
        return 1;
    while(left < right){
        if(arr[left] == sum){
            res++;
            left++;
        }else if(arr[right] == sum){
            res++;
            right--;
        }else{
            if(arr[left] + arr[right] == sum){
                //cout << arr[left] << " " << arr[right] << endl;
                res++;
                left++;
                right--;
            }else if(arr[left] + arr[right] < sum){
                left++;
            }else{
                right--;
            }
        }

    }
    return res;
}

int main()
{
    cin >> sum;
    cin >> str;
    vector<int> arr;
    if(str == "")
        return 0;
    int x1 = 0;
    int x2 = 0;
    int int_temp;
    string stemp;
    while (true){
        x2 = str.find(',', x1);//返回首次匹配的逗號的下標
        if(x2 == -1)
            break;
        stemp = str.substr(x1, x2 - x1);//擷取從字串str中第x1位開始的長度為(x2-x1)的字串
        int_temp = atoi(stemp.c_str());
        arr.push_back(int_temp);
        x1 = x2 + 1;//更改下次查詢起始位置
    }
    stemp = str.substr(x1, str.size()-x1);
    int_temp = atoi(stemp.c_str());
    arr.push_back(int_temp);

    for(int i=0; i<arr.size(); i++)
        cout << arr[i] << " ";
    cout << endl;
    sort(arr.begin(), arr.end());

    int res = countOfSum(arr, sum);
    cout << res << endl;
    return 0;
}
/*
5
1,2,3,4,5
*/