順豐科技 2019校園招聘筆試程式設計題-2018.09.15
阿新 • • 發佈:2019-02-02
這道題 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
題目中取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
*/