2020/9/6 20:00 腾讯笔试

虽然题目上说链表,但是可以用数组,而且已经排好序了,遍历一遍就可

//1.

100代码
typedef long long ll;

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	int n; cin >> n;
	deque<int>a(n);
	for (int i = 0; i < n; i++) cin >> a[i];
	int m; cin >> m;
	deque<int>b(m);
	for (int i = 0; i < m; i++) cin >> b[i];
	int i = 0, j = 0;
	while (i < a.size() && j < b.size()) {
		if (a[i] == b[j]) cout << a[i] << ' ';
		else if (a[i] < b[j]) i--;
		else if (a[i] > b[j]) j--;
		i++, j++;
	}
	cout << endl;
}


并差集模板

//2.

100代码
typedef long long ll;

const int maxn = 1e5 + 5;
int ran[maxn];
int f[maxn];
void init() {
	for (int i = 0; i < maxn; i++) {
		f[i] = i;
	}
}
int fin(int x) {
	return f[x] = f[x] == x ? x : fin(f[x]);
}
void meg(int x, int y) {
	int a = fin(x);
	int b = fin(y);
	if (ran[a] < ran[b]) {
		f[a] = b;
	}
	else {
		f[b] = a;
		if (ran[a] == ran[b]) {
			ran[a]++;
		}
	}
}
bool same(int x, int y) {
	return fin(x) == fin(y);
}

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	int m, n; cin >> n >> m;
	init();
	for (int i = 0; i < m; i++) {
		int num; cin >> num;
		int vis; cin >> vis;
		num--;
		int t;
		while (num--) {
			cin >> t;
			if (!same(vis, t)) {
				meg(vis, t);
			}
		}
	}
	int ans = 0;
	int anst = fin(0);
	for (int i = 0; i < maxn; i++) {
		if (fin(i) == anst) ans++;
	}
	cout << ans << endl;
}


使用map计数

再转换到vector上,

使用自定义的cmp排序,

输出前k

//3.

100代码

typedef long long ll;
typedef pair<string, int> psi;

bool cmp1(psi a, psi b) {
	if (a.second == b.second) return a.first < b.first;
	return a.second < b.second;
}
bool cmp2(psi a, psi b) {
	if (a.second == b.second) return a.first < b.first;
	return a.second > b.second;
}

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	int n, k; cin >> n >> k;
	unordered_map<string, int>mp;
	string s;
	for (int i = 0; i < n; i++) {
		cin >> s;
		mp[s]++;
	}
	vector<psi>v1;
	for (auto it = mp.begin(); it != mp.end(); it++)
		v1.emplace_back(psi{ it->first,it->second });
	auto v2 = v1;;
	sort(v1.begin(), v1.end(), cmp1);
	sort(v2.begin(), v2.end(), cmp2);
	for (int i = 0; i < k; i++)
		cout << v2[i].first << ' ' << v2[i].second << endl;
	for (int i = 0; i < k; i++)
		cout << v1[i].first << ' ' << v1[i].second << endl;
}


其实答案就两个,

先复制原数组

对一个排序变成新数组

遍历原数组,判断在新数组的左边还是右边

左边就输出新数组靠右的中位数

右边就输出新数组靠左的中位数

//4.

100代码

typedef long long ll;

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	int n; cin >> n;
	vector<int>s(n);
	for (int i = 0; i < n; i++) cin >> s[i];
	auto t = s;
	sort(s.begin(), s.end());
	int mid = n >> 1;
	for (int i = 0; i < n; i++) {
		int it = lower_bound(s.begin(), s.end(), t[i]) - s.begin();
		if (it < mid) cout << s[mid] << endl;
		else cout << s[mid - 1] << endl;
	}
}


第五题,没思路,我用了冒泡插入选择,都是5%,而且我觉得交什么都是5%(有一次交的别的代码,也是5%),手动狗头。

#笔试题目##腾讯#
全部评论
中位数那个题 把自己绕晕了,原来这么简单
点赞 回复 分享
发布于 2020-09-06 22:21
我直接输出0就是百分之5🤔
点赞 回复 分享
发布于 2020-09-06 22:27

相关推荐

头像
11-10 15:58
东北大学 Java
ros275229:我还没收到,但是距离上一次面试快一个月了
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务