贝壳找房4月12日算法笔试题AC代码(1,2,3)


1. 给定整数数组 A(A 中元素取值 0~9), 每次从 A 的首部或尾部选择一个数加入新的队列直到 A 为空, 问新的队列组成的数(从左往右看)最小是多少(可以包含前导 0)
#include <iostream>
#include <vector>
using namespace std;

bool cmp(vector<int>& a, int l, int r){
        // 通过比较函数来确定加入新队列的元素
	while (l < r){
		if (a[l] < a[r]) return true;
		else if (a[l] == a[r]) { ++l; --r; }
		else return false;
	}
	return true;
}

int main(){
	int n; cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++){
		cin >> a[i];
	}

	vector<int> v;
	int i = 0, j = n - 1;
	while (i <= j){
		if (cmp(a, i, j)) v.push_back(a[i++]);
		else v.push_back(a[j--]);
	}

	for (int k = 0; k < n; k++){
		cout << v[k];
	}
	cout << endl;

	return 0;
}    
2.
用双向链表进行模拟
#include <iostream>
#include <vector>
using namespace std;

const int INF = 1000000000;

struct ListNode{
	int val;
	ListNode *prev, *next;
	ListNode(int x) : val(x), prev(NULL), next(NULL) {}
	ListNode(int x, ListNode* p, ListNode* q) :
		val(x), pre***ext(q) {}
};

void constructList(ListNode* head, int n){
	ListNode* p = head;
	int x;
	for (int i = 0; i < n; i++){
		scanf("%d", &x);
		p->next = new ListNode(x, p, NULL);
		p = p->next;
	}
}

void run(ListNode* head){
	ListNode *p;
	int mx = INF;
	for (p = head->next; p != NULL; p = p->next){
		if (p->val < mx){
			printf("%d ", p->val);
			mx = p->val;
			p->prev->next = p->next;
			if (p->next != NULL){
				p->next->prev = p->prev;
			}
		}
	}
	printf("\n");
}

int main(){
	int n; scanf("%d", &n);
	ListNode* head = new ListNode(0);
	constructList(head, n);
	while (head->next != NULL){
		run(head);
	}

	return 0;
}
3.
标准的回溯算法。由于要输出最终字典序最小的方案, 用一个数组来记录。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int ans = 100;
vector<int> order;

int n, m;
vector<int> a;
vector<vector<int>> b;

bool check(vector<int>& sum){
	for (int i = 0; i < n; i++){
		if (sum[i] < a[i]) return false;
	}
	return true;
}

void dfs(vector<int>& sum, vector<int>& arr, int cnt, int cur){
	if (check(sum) && cnt < ans){
		ans = cnt;
		order.clear();
		order.assign(arr.begin(), arr.end());
		return;
	}
	if (cur == m) return;
	// chose b[cur]
	for (int i = 0; i < n; i++){
		sum[i] += b[cur][i];
	}
	arr.push_back(cur + 1);
	dfs(sum, arr, cnt + 1, cur + 1);
	arr.pop_back();
	for (int i = 0; i < n; i++){
		sum[i] -= b[cur][i];
	}
	//abandon b[cur]
	dfs(sum, arr, cnt, cur + 1);
}

int main(){
	cin >> n;
	a.resize(n);
	for (int i = 0; i < n; i++){
		cin >> a[i];
	}
	cin >> m;
	b.resize(m, vector<int>(n));
	for (int i = 0; i < m; i++){
		for (int j = 0; j < n; j++){
			cin >> b[i][j];
		}
	}

	vector<int> sum(n), arr;
	dfs(sum, arr, 0, 0);

	cout << ans << endl;
	for (int x : order) cout << x << ' ';
	cout << endl;

	return 0;
}
4.
不会做,也没想到方法。

#贝壳找房##算法工程师##笔经#
全部评论

相关推荐

个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
2
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务