拼多多 9.1 大数据研发笔试题

三题得分 100, 100, 30

第一题

给定m个数字及一个数字n, 将这m个数字进行如下方式排序后取出前n项并输出
1. 偶数排在奇数前面
2. 相同奇偶性时,数值越大排在越靠前的位置

思路:
荷兰国旗问题  + 排序
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e8 + 10;
int arr[maxn];
int n;

void print_ans(int lo, int hi) {
	for (int i = lo; i < hi - 1; ++i) cout << arr[i] << ",";
	cout << arr[hi - 1];
}

int main() {
	int num;
	char ch;
	int size = 0;
	while (cin >> num >> ch) {
		arr[size++] = num;
		if (ch == ';') break;
	}
	cin >> n;
	
	int cur = 0, lo = 0;
	while (cur < size) {
		if (arr[cur] % 2 == 0) swap(arr[cur], arr[lo++]);
		++cur;
	}
	
	sort(arr, arr + lo, greater<int>());
	sort(arr + lo, arr + size, greater<int>());
	print_ans(0, n); cout << endl;
	return 0;
}

第二题


小梅和他男朋友小白玩游戏,
小梅有N <= 8张牌, 小白有 M <= N张牌, 小梅将牌从左往右铺开(不一定排序) ,小白同样将自己的牌从左往右铺开
小梅对自己的牌从左到右进行N个回合的操作,生成一个新的牌序列, 每个回合操作有如下三种选择

1. d   取出一张牌 丢掉
2. l   取出一张牌 将他放在 新序列的左边
3. r   取出一张牌 将他放在 新序列的右边

当 新序列 = 小白的牌序列时,  小梅赢,  求 小梅能够获胜的所有的赢法


思路:
暴力解法
#include <bits/stdc++.h>
using namespace std;

vector<string> ans;
string mei, bai;

void print_ans() {
	cout << "{" << endl;
	for (string& a : ans) {
		for (char ch : a) {
			cout << ch << " ";
		}	
		cout << endl;
	}
	cout << "}" << endl;
}

void solve(int cur, string ret, string choice) {
	if (cur == mei.size()) {
		if (ret == bai) ans.push_back(choice);
		else return;
	} else {
		solve(cur + 1, ret, choice + 'd');
		solve(cur + 1, ret + mei[cur], choice + 'r');
		solve(cur + 1, mei[cur] + ret, choice + 'l');	
	}
}

int main() {
	int cnt;
	cin >> cnt;
	while (cnt--) {
		cin >> mei >> bai;
		ans.clear();
		solve(0, "", "");
		sort(ans.begin(), ans.end());
		print_ans();
	}
	return 0;
}

第三题


n * m 的宫格 ,  其中 位置 (i, j) 方格的值为 i * j
将 宫格中的数字降序排序,给定 数字 k , 求该降序序列中第k 个数字的值

举例

n = 3, m = 3, k = 3, 宫格长这样

1 2 3
2 4 6
3 6 9

排序后 {9, 6, 6, 4, 3, 3, 2, 2, 1}

k = 3时  输出 6

AC 30% ,据说能用二分法解,不会,请大佬解答!
#include <bits/stdc++.h>
using namespace std;

priority_queue<int> pq;
int n, m, k;

int main() {
	cin >> n >> m >> k;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			pq.push(i * j);
		}
	}
	
	for (int i = 1; i < k; ++i) pq.pop();
	int ans = pq.top();
	cout << ans << endl;
	
	return 0;
}


#拼多多##笔试题目##题解#
全部评论
第三题LeetCode668。
点赞 回复 分享
发布于 2019-09-01 19:35

相关推荐

11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
评论
点赞
14
分享
牛客网
牛客企业服务