admin 管理员组文章数量: 893558
求职面试题
v***在线笔试
时间:2-7 15:00
工具:牛客网
题型:7到单选、3道多选、3道编程,90min
编程1:拿手机的方案(类似于上楼梯),一次可以拿1、2、3、4部手机,问仓库里n台手机有多少种方案进行拿取?
int total_count(int n) {if (n <= 0) {return 0;} else if (n == 1) {return 1;} else if (n == 2) {return 3;} else if (n ==3 ) {return 4;} else if (n == 4) {return 8;} else {std::vector<int> dp(n, 0);dp[1] = 2, dp[2] = 3, dp[3] = 4, dp[4] = 8;for (int i = 5; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2] + dp[i-3] + dp[i-4];}return dp[n];}
}
编程2:
有一个数组nums,每个元素代表着对应的图片被查看的次数。以后每查看一张图片,则对应的位置加1。输入一个数n,表示可以查看的总次数,问查看n此后nums中元素出现的最大频次是多少?
举例:3 [3,4,5] 说明:有3张图片(nums有3个元素),图片分别已经被查看3、4、5次,还可以查看3次
输出:4 说明:查看图片0两次、图片1一次,则nums变为[5,5,5],所以最大频数是3。
解决思路:先对nums排序,再从后遍历,
int getMaxFreq(int n, std::vector<int>& nums) {int len = nums.size();sort(nums.begin(), nums.end());int max_count = 0;for (int i = len - 1; i > 0; --i) {int max_count_tmp = 1;int gap = 0;int n_copy = n;int j = 1;while(n_copy && (i-j) >= 0) {gap = nums[i] - nums[i-j];if(gap > n_copy) {break;} else {n_copy -= gap;max_count_tmp++;}j++;}max_count = max_count_tmp > max_count ? max_count_tmp:max_count;}return max_count;
}
编程3:动态规划-多重背包
分房:有n个员工,k种房间、每种房间可容纳的人为p1,p2,…,pk,费用为c1,c2,…,ck,数量为r1,r2,…,rk。
如何分房,花费最小
分析:背包容量就是n,有k种物品、每种有rk个、代价是pk、费用是ck(代价其实就是重量、或者体积,此处体积更好)
还是有点不一样,没想出来
int minCost(int n, std::vector<int>& p, std::vector<int>& c, std:vector<int>& r) {int bagV = n;int objNum = p.size();std::vector<int> dp(bagV + 1, 0);for (int i = 1; i <= objNum; ++i) {for (int j = bagV; j > 0; j--) {if (j < p[i]) {dp[j] = dp[j];} else {for (int k = 0; k <= j / p[i] && k <= r[i]; k++) {dp[j] = min(dp[j], dp[j - k * p[i]] + k * c[i]);}}}}return dp[bagV];
}
o***在线笔试
单选、多选、两道编程题,90min
编程题1:
输出倒叙数
编程题2:
/*** author: CofCai* datatime: 2022-03-04 11:59:12* file description:* OPPO在线笔试第2道编程题* 一个单链表,如1-2-3-4-5* 返回1-5-2-4-3,即最前和最后两两对应。需自己处理输入,然后构造链表* 输入样例:head = [1,2,3,4,5]* 输出样例:[1,5,2,4,3]* 思路:1.处理输入,构造链表head* 2. 将链表从中间断开,形成2个链表,即head1、head2* 3. 将head2反转* 4. 依次取head1、head2的元素进行连接*/
using namespace std;void display_value(string str, struct List* const head);struct List
{int val;struct List* next;
};int main()
{// 处理输入:head = [1,2,3,4,5]string input;cin >> input >> input >> input;// cout << input << endl;struct List* head = (struct List*)malloc(sizeof(struct List));struct List* cur = head;int len_str = input.size();int len = 0;for (int i = 1; i < len_str; i += 2){len++;cur->val = input[i] - 0x30;if(i + 2 >= len_str) {cur->next = nullptr;} else {cur->next = (struct List*)malloc(sizeof(struct List));cur = cur->next;}// cout << cur->next->val << endl;}// 处理逻辑// 1. 将链表平均分为两段、即head1、head2cur = head;for (int i = 0; i < len/2 - 1; ++i) {cur = cur->next;}struct List* tmp = cur->next;cur->next = nullptr;struct List* head2 = tmp;struct List* head1 = head;// display_value("head1: ", head1);// display_value("head2: ", head2);// 2. 反转head2cur = head2;struct List* pre = nullptr;tmp = cur;while(cur) { /// cur->nexttmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}head2 = pre; /// head2 = cur 为何改为这两句就不行了????// display_value("head1: ", head1);// display_value("head2: ", head2);// 3. 顺序拼接head和head2struct List* cur1 = head1;struct List* cur2 = head2;struct List* tmp1 = nullptr;struct List* tmp2 = nullptr;while(cur1) {tmp1 = cur1->next;tmp2 = cur2->next;cur1->next = cur2;if(tmp1 == nullptr && tmp2 != nullptr) {cur2->next = tmp2;}else {cur2->next = tmp1;}// 更新cur1 = tmp1;cur2 = tmp2;}display_value("", head1);return 0;
}void display_value(string str, struct List* const head){if(str.size())cout << str;struct List* cur = head;while(cur) {cout << cur->val << " ";cur = cur->next;}cout << endl;
}
本文标签: 求职面试题
版权声明:本文标题:求职面试题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687327686h90013.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论