参考代码随想录
拿我们刚讲过的这道题动态规划:使用最小花费爬楼梯 (opens new window)来做示范
#include
#include
using namespace std;
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size());
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < cost.size(); i++) {
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
}
return min(dp[cost.size() - 1], dp[cost.size() - 2]);
}
};
int main() {
int a[] = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
vector<int> cost(a, a + sizeof(a) / sizeof(int));
Solution solution;
cout << solution.minCostClimbingStairs(cost) << endl;
}
示例一:
输入: 4 1 1 0 0 0 1 1 0
输出: 2
#include
#include
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int> gym(n);
vector<int> work(n);
for (int i = 0; i < n; i++) cin >> work[i];
for (int i = 0; i < n; i++) cin >> gym[i];
int result = 0;
// 处理逻辑
cout << result << endl;
}
return 0;
}
c++利用vector创建二维数组的几种办法
#include
#include
using namespace std;
void test01() {
//创建一个外层容器
vector<vector<int>>v;
//创建一些内层容器,并赋值
vector<int>v1(10,1);
vector<int>v2(10,2);
vector<int>v3(10,3);
//将内层小容器插入到大容器之中,类似于二维数组。
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
}
以移除链表元素为例
#include
#include
using namespace std;
// 单链表结点定义
struct ListNode{
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
// 生成链表
ListNode* constructList(vector<int> nodes)
{
ListNode* dummyHead = new ListNode();
ListNode* cur = dummyHead;
for (auto i : nodes)
{
cur->next = new ListNode(i);
cur = cur->next;
}
cur = dummyHead->next;
delete dummyHead;
return cur;
}
// 打印链表
void printList(ListNode* head)
{
ListNode* cur = head;
if (cur == NULL)
{
cout << "[]" << endl;
}
while (cur != NULL)
{
cout << cur->val << ' ';
cur = cur->next;
}
}
// 使用虚假头部统一删除结点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* dummyHead = new ListNode();
dummyHead->next = head;
ListNode* cur = dummyHead;
while (cur->next != NULL)
{
if (cur->next->val == val)
{
ListNode* temp = new ListNode();
temp = cur->next;
cur->next = cur->next->next;
delete temp;
}
else
{
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
int main() {
// int nums[] = {1,2,6,3,4,5,6}; 7,7,7,7
// int val = 6;
int nums[] = {7,7,7,7};
int val = 7;
vector<int> nodes(nums, nums + sizeof(nums) / sizeof(int));
ListNode* head = constructList(nodes);
Solution solution;
ListNode* result = solution.removeElements(head, val);
printList(result);
return 0;
}
参考代码随想录
以以下这道题为例
538.把二叉搜索树转换为累加树
根据数组构造二叉树的基本步骤
#include
#include
#include
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 根据数组构造二叉树
TreeNode* construct_binary_tree(const vector<int>& vec) {
vector<TreeNode*> vecTree (vec.size(), NULL);
TreeNode* root = NULL;
for (int i = 0; i < vec.size(); i++) {
TreeNode* node = NULL;
if (vec[i] != -1) node = new TreeNode(vec[i]);
vecTree[i] = node;
if (i == 0) root = node;
}
for (int i = 0; i * 2 + 2 < vec.size(); i++) {
if (vecTree[i] != NULL) {
vecTree[i]->left = vecTree[i * 2 + 1];
vecTree[i]->right = vecTree[i * 2 + 2];
}
}
return root;
}
// 层序打印打印二叉树
void print_binary_tree(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (node != NULL) {
vec.push_back(node->val);
que.push(node->left);
que.push(node->right);
}
// 这里的处理逻辑是为了把null节点打印出来,用-1 表示null
else vec.push_back(-1);
}
result.push_back(vec);
}
for (int i = 0; i < result.size(); i++) {
for (int j = 0; j < result[i].size(); j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
}
int main() {
// 注意本代码没有考虑输入异常数据的情况
// 用 -1 来表示null
vector<int> vec = {4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8};
TreeNode* root = construct_binary_tree(vec);
print_binary_tree(root);
}
链接:https://ac.nowcoder.com/acm/contest/5657/A
来源:牛客网
输入描述:
输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。
输出描述:
输出a+b的结果
输入
1 5
10 20
输出
6
30
#include
using namespace std;
int main()
{
int a , b;
while (cin >> a >> b)
{
cout << a + b << endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/B
来源:牛客网
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 1000)
输入
2
1 5
10 20
输出
6
30
#include
using namespace std;
int main()
{
int a, b, count;
cin >> count;
while (count -- )
{
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/C
来源:牛客网
输入描述:
输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输入
1 5
10 20
0 0
输出
6
30
#include
using namespace std;
int main()
{
int a, b;
while (cin >> a >> b )
{
if (a == 0 && b == 0)
{
break;
}
cout << a + b << endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/D
来源:牛客网
输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
4 1 2 3 4
5 1 2 3 4 5
0
输出
10
15
#include
using namespace std;
int main()
{
int sum;
int count;
while (cin >> count)
{
if (count == 0) break;
while(count -- )
{
int a;
cin >> a;
sum += a;
}
cout << sum << endl;
sum = 0;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/E
来源:牛客网
输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
2
4 1 2 3 4
5 1 2 3 4 5
输出
10
15
#include
using namespace std;
int main()
{
int sum;
int row;
cin >> row;
while (row -- )
{
// if (count == 0) break;
int column;
cin >> column;
while(column -- )
{
int a;
cin >> a;
sum += a;
}
cout << sum << endl;
sum = 0;
}
return 0;
}
和第四道基本一样
链接:https://ac.nowcoder.com/acm/contest/5657/F
来源:牛客网
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
4 1 2 3 4
5 1 2 3 4 5
输出
10
15
#include
using namespace std;
int main()
{
int sum;
int count;
while (cin >> count)
{
// if (count == 0) break;
while(count -- )
{
int a;
cin >> a;
sum += a;
}
cout << sum << endl;
sum = 0;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/G
来源:牛客网
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
示例1
输入
1 2 3
4 5
0 0 0 0 0
输出
6
9
0
#include
using namespace std;
int main()
{
int sum;
int num;
while (cin >> num)
{
sum = 0;
while(true)
{
sum += num;
if (cin.get() == '\n') // 重点
{
break;
}
cin >> num;
}
cout << sum << endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/H
来源:牛客网
输入描述:
输入有两行,第一行n
第二行是n个字符串,字符串之间用空格隔开
输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格
示例1
输入
5
c d a bb e
输出
a bb c d e
#include
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> vec(n);
for (int i = 0; i < n; i ++ )
{
cin >> vec[i];
}
sort(vec.begin(), vec.end()); // 排序
string res = "";
for (int i = 0; i < n; i ++ )
{
res += vec[i];
res += " ";
}
res.pop_back(); // 去掉空格
cout << res << endl;
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/I
来源:牛客网
输入描述:
多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100
输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
示例1
输入
a c bb
f dddd
输出
a bb c
dddd f
#include
#include
#include
using namespace std;
int main()
{
string temp;
while (cin >> temp)
{
vector<string> s;
while (true)
{
s.push_back(temp);
if(cin.get()=='\n') break;
cin >> temp;
}
sort(s.begin(), s.end());
for (auto i : s)
{
cout << i << " ";
}
cout << endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/5657/J
来源:牛客网
输入描述:
多个测试用例,每个测试用例一行。
每行通过,
隔开,有n个字符,n<100
输出描述:
对于每组用例输出一行排序后的字符串,用','
隔开,无结尾空格
示例1
输入
a,c,bb
f,dddd
nowcoder
输出
a,bb,c
dddd,f
nowcoder
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main() {
string s;
while (getline(cin, s)) { // 读取整行
stringstream ss(s); // 转化为string
vector<string> vec;
string tmp;
while (getline(ss, tmp, ',')) { //getline的第三个参数是终止字符,到当前字符终止
vec.push_back(tmp);
}
sort(vec.begin(), vec.end());
string res = "";
for (auto sss : vec) res += sss + ',';
res.pop_back();
cout << res << endl;
}
return 0;
}
字符串分割神器–stringstream+getline