vivo提前批笔试题整理
寻找数组中不存在的元素
题目描述
A、B两个数组,要求输出A中存在而B中不存在的元素。
例如
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void solution1(vector<int> a,vector<int> b)
{
int asize = a.size();
int bsize = b.size();
vector<int> result;
for (int i = 0; i < asize; i++)
{
vector<int>::iterator it = find(b.begin(), b.end(), a[i]);
if (it == b.end())
result.push_back(a[i]);
}
int rsize = result.size();
if (rsize == 0)
cout << "No match!\n";
else
{
for (int i = 0; i < rsize - 1; i++)
cout << result[i] << " ";
cout << result[rsize - 1] << endl;
}
}
int main()
{
vector<int> a{ 3,2,8,5,7,4,9,1 };
vector<int> b{ 3,8,1,9,5,10 };
solution1(a,b);
system("pause");
return 0;
}
倒序链表中的两个元素之间的元素
题目描述
一个单向链表,输入m,n,要求在第m和第n区间之内的元素倒序存储并输出此链表。
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
//vivo笔试中的解题方法
//void reverseBetween(ListNode* head, int m, int n) {
// vector<int>temp;
// ListNode *p=head;
// while (p != NULL)
// {
// temp.push_back(p->val);
// p = p->next;
// }
// reverse(temp.begin() + m - 1, temp.begin() + n);
// int tsize = temp.size();
// for (int i = 0; i < tsize; i++)
// {
// cout << temp[i] << " ";
// }
// cout << endl;
//}
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (!head || !head->next || n == m)
return head;
struct ListNode *L = (struct ListNode *)malloc(sizeof(struct ListNode));
L->next = head; //删除节点常用手段考虑加个头指针
struct ListNode* pre = NULL;
struct ListNode* p = L;
int temp_m = m;
int temp_n = n;
//将p转移到反转链表的第一个节点,pre保存前一个节点
while (temp_m-- >= 1) {
pre = p;
p = p->next;
}
struct ListNode* reverse_head = NULL;
struct ListNode* reverse_tail = p;
struct ListNode* reverse_tail_after = NULL;
struct ListNode* q = NULL;
//进行反转
while (temp_n - m > 0) {
q = p->next;
reverse_tail_after = q->next;
p->next = reverse_head;
reverse_head = p;
p = q;
temp_n--;
}
p->next = reverse_head;
reverse_head = p;
pre->next = reverse_head;
reverse_tail->next = reverse_tail_after;
return L->next;
}
int main()
{
ListNode *temp1 = new ListNode(1);
ListNode *head = temp1;
for (int i = 2; i <= 10; i++)
{
ListNode * newnode = new ListNode(0);
newnode->val = i;
newnode->next = NULL;
temp1->next = newnode;
temp1 = temp1->next;
}
//reverseBetween(head, 3, 7);
ListNode *result = reverseBetween(head, 3, 7);
ListNode *p = head;
while (p != NULL)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
system("pause");
return 0;
}
0-1背包问题
题目描述
有n种礼品,每个礼品对应一个热度值,总金额为k,每个礼品只能买一次,如何购买可以使得所有礼品的总热度值最高。
代码
/*
* vivo2019提前批笔试第三题:
* 小v负责一次活动礼品采购,每一款礼品的受欢迎程度(热度值)各不相同,现给出总金额以及各个礼品的单价
* 和热度值,且每个礼品只购买一个,如何购买可以使得所有礼品的总热度值最高。
* 输入:
* 第一行是一个正整数,表示总金额(不大于1000)
* 第二行是一个长度为n的正整数数组,表示礼品单价(n不大于100)
* 第三行是一个长度为n的正整数数组,表示对应礼品的热度值
* 输出:
* 一个正整数,表示可以获得的最高总热度值
*
* 样例输入:1000
* 200 600 100 180 300 450
* 6 10 3 4 5 8
* 样例输出:21
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution3(int total,int len, vector<int>price, vector<int>hot)
{
vector<vector<int> > dp(len + 1, vector<int>(total + 1, 0));
for (int i = 1; i <= len; i++)
{
for (int j = 1; j <= total; j++)
{
if (price[i - 1]>j)
{
dp[i][j] = dp[i - 1][j];
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - price[i - 1]] + hot[i - 1]);
}
}
}
return dp[len][total];
}
int main()
{
int n, total;//商品数量和总价
int temp;//临时变量
cout << "请输入n和总价:" << endl;
cin >> n >> total;//输入商品数量值和商品总价
vector<int> hot;
vector<int> price;
//价格存入
cout << "请输入热度" << endl;
for (int i = 0; i<n; i++)
{
cin >> temp;
hot.push_back(temp);
}
for (int i = 0; i<n; i++)
{
cin >> temp;
price.push_back(temp);
}
//下面开始进行处理
int result = solution3(total, n, price, hot);
cout << result << endl;
system("pause");
return 0;
}
文章评论