拼多多2018秋招内推第二波 编程题

第一题

逆时针输出矩阵,剑指offer和leetcode原题

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
using namespace std;

int main() {
	string str;
	getline(cin, str);
	cout << str << endl;
	int k = str.size() / 4;
	int d = k + 1;
	vector<string> res(d, string(d, ' '));

	int left = 0, right = k, top = 0, bottom = k, i = 0;
	for (int j = 0; j < d; j++) {
		res[0][j] = str[i];
		i = i + 1;
	}
	for (int j = 1; j < d; j++) {
		res[j][k] = str[i];
		i = i + 1;
	}
	for (int j = d - 2; j >= 0; j--) {
		res[d - 1][j] = str[i];
		i = i + 1;
	}
	for (int j = d - 2; j > 0; j--) {
		res[j][0] = str[i];
		i = i + 1;
	}

	for (int j = 0; j < d; j++)
		cout << res[j] << endl;
	cin.get();
}

第二题

和leetcode的一道题很像,先二分输入的数字,再对数字进行generateNum的操作,主要是合并的时候,他不能有重复的两对数字,先考虑的用set<vector<double> > res,但往set里加元素要注意了;也可以用multimap,他是键可以重复的map

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
#include <set>
using namespace std;



vector<double> generateNum(string str) {
	vector<double> res;
	if (str.empty())
		return res;

	int num = atoi(str.c_str());
	if (str[0] == '0') {
		if (str.size() > 1 && num == 0)
			return res;
		double t = (double)num / pow(10, (str.size() - 1));
		res.push_back(t);
	}
	else {
		for (int i = 0; i < str.size(); i++) {
			double t = (double)num / pow(10, i);
			res.push_back(t);
		}
	}
	return res;
}

int main() {
	string str;
	getline(cin, str);
	int len = str.size();
	if (len < 2) return 0;
	set<vector<double> > res;
	//multimap<double, double> m;   // #include <map>
	for (int i = 1; i < len; i++) {
		vector<double> left = generateNum(str.substr(0, i));
		vector<double> right = generateNum(str.substr(i));
		cout << "left" << endl;
		for (int j = 0; j < left.size(); j++) {
			cout << left[j] << endl;
		}
		cout << "right" << endl;
		for (int j = 0; j < right.size(); j++) {
			cout << right[j] << endl;
		}

		for (int j = 0; j < left.size(); j++) {
			for (int k = 0; k < right.size(); k++) {
				if (left[j] - right[k] > 1e-4)
					res.insert({ left[j], right[k] });
					//m.insert({ left[j], right[k] });
					//m[right[k]] = left[j];
				else //m[left[j]] = right[k];
					//m.insert({ right[k], left[j]});
					res.insert({ right[k], left[j] });
			}
			//res.insert({ left[j], right[k] });
			//cout << m.size() << endl;
		}
		cout << "m" << endl;
		for (auto iter = res.begin(); iter != res.end(); iter++) {
			vector<double> t = *iter;
			cout << t[0] << "  " << t[1] << endl;
		}
		//for (auto iter = m.begin(); iter != m.end(); iter++) {
		//	cout << iter->first << " " << iter->second << endl;
		//}
	}
	cout << res.size();
	cin.get();
	return 0;
}


第三题

思路不难,就是处理输入数据太难,,,,

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
int main() {
	int n, id;
	cin >> n >> id;  //cin是不会读 /n 的,所以要加 getchar()
	getchar();
	vector<vector<int> > fri;
	for (int i = 0; i < n; i++) {
		string str;
		getline(cin, str);
		vector<int> out;
		int j = 0, num = 0;
		while (j < str.size()) {
			num = 0;
			while (j < str.size() && str[j] >= '0' && str[j] <= '9') {
				num = num * 10 + (str[j++] - '0');
			}
			j++;
			out.push_back(num);
		}
		sort(out.begin(), out.end());
		fri.push_back(out);
	}

	vector<int> target = fri[id];
	int maxid = 0, maxnum = 0;
	for (int i = 0; i < fri.size(); i++) {
		if (i == id) continue;
		vector<int> out = fri[i];
		//if (target.back() < out.front() || out.back() < target.front()) continue;
		int cnt = 0, k = 0;
		for (int j = 0; j < out.size(); j++) {
			if (k < target.size() && out[j] == target[k++])
				cnt++;
		}
		if (maxnum < cnt) {
			maxnum = cnt;
			maxid = i;
		}

	}
	cout << maxid << endl;
	cin.get();
	return 0;
}


第四题

原谅我还不会,,,感觉是有点类似于买卖股票第三题那种,然而股票第三题我仍然没搞懂背后原理。。。。坐等大神们的答案

猜你喜欢

转载自blog.csdn.net/YC_cd/article/details/81450592