C/C++每日一练(20230405)
Posted Hann Yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++每日一练(20230405)相关的知识,希望对你有一定的参考价值。
目录
1. 数组元素循环右移问题
题目:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
以下程序实现了这一功能,请你填补空白处内容:
```c++
#include <stdio.h>
int main()
int n, m, a[1000];
scanf("%d %d", &n, &m);
m = m % n;
int count = m;
______________;
for (int i = 0; i < count; i++)
scanf("%d", &a[i]);
int first = 1;
for (int i = 0; i < n; i++)
if (!first)
printf(" ");
printf("%d", a[i]);
first = 0;
```
出处:
https://edu.csdn.net/practice/24744548
代码:
c++
输出:
6 2
1 2 3 4 5 6
5 6 1 2 3 4
2. 输出字符图形
输入一个正整数n(代表图形的行数),输出如样例形式的图形。
输入:7
输出:
D D
CD DC
BCD DCB
ABCDDCBA
BCD DCB
CD DC
D D
以下程序实现了这一功能,请你填补空白处内容:
```c++
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
int n;
cin >> n;
vector<string> a(n, ""), b(n, "");
int m = (n + 1) / 2;
int p = 0;
for (int i = m - 1; i >= 0; i--)
for (int j = 0; j <= i; j++)
a[i].push_back('A' + j + p);
b[i] = a[i];
reverse(b[i].begin(), b[i].end());
___________________;
p++;
p = 0;
for (int i = n - 1; i >= m; i--)
a[i] = a[p];
b[i] = b[p++];
for (int i = 0; i < n; i++)
cout << a[i] << b[i] << endl;
return 0;
```
出处:
https://edu.csdn.net/practice/24744549
代码:
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
int n;
cin >> n;
vector<string> a(n, ""), b(n, "");
int m = (n + 1) / 2;
int p = 0;
for (int i = m - 1; i >= 0; i--)
for (int j = 0; j <= i; j++)
a[i].push_back('A' + j + p);
b[i] = a[i];
reverse(b[i].begin(), b[i].end());
for (int j = i + 1; j < m; j++)
a[i] += " ";
b[i] = " " + b[i];
p++;
p = 0;
for (int i = n - 1; i >= m; i--)
a[i] = a[p];
b[i] = b[p++];
for (int i = 0; i < n; i++)
cout << a[i] << b[i] << endl;
return 0;
输入输出:
7↙
D D
CD DC
BCD DCB
ABCDDCBA
BCD DCB
CD DC
D D
3. 移除链表元素
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
提示:
- 列表中的节点数目在范围
[0, 10^4]
内 1 <= Node.val <= 50
0 <= val <= 50
出处:
https://edu.csdn.net/practice/24744550
代码:
#define null INT_MIN
#include <bits/stdc++.h>
using namespace std;
struct ListNode
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL)
;
class Solution
public:
ListNode *removeElements(ListNode *head, int val)
ListNode *dumynode = new ListNode(0);
dumynode->next = head;
ListNode *fast = dumynode->next;
ListNode *slow = dumynode;
while (fast != NULL)
if (fast->val == val)
slow->next = slow->next->next;
else
slow = slow->next;
fast = fast->next;
ListNode *ret = dumynode->next;
delete dumynode;
return ret;
;
ListNode* buildNodeList(vector<int> vec)
ListNode *head = new ListNode(0);
ListNode *p = head;
for (size_t i = 0; i < vec.size(); i++)
ListNode *node = new ListNode(vec[i]);
p->next = node;
p = p->next;
return head->next;
string NodeList2String(ListNode *head)
if (head==NULL) return "[]";
ListNode *p = head;
string res = "[";
while (p != nullptr)
res.append(to_string(p->val));
res.append(",");
p = p->next;
res.pop_back();
res.append("]");
return res;
int main()
Solution s;
vector<int> nums = 1,2,3,6,4,5,6;
ListNode* root = buildNodeList(nums);
cout << NodeList2String(s.removeElements(root, 6)) << endl;
nums = 7,7,7,7,7;
root = buildNodeList(nums);
cout << NodeList2String(s.removeElements(root, 7)) << endl;
return 0;
输出:
[1,2,3,4,5]
[]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |
C/C++每日一练(20230401)
目录
2. 好数对 ※
1. 移动数组中的元素
将一维数组中的元素循环左移 k 个位置
输入描述
第 1 行是一维数组元素的个数 n (数组大小)
第 2 行是一个整数 k , 表示移动的位置
下面 n 行为数组的元素个数
输出描述
输出 n 行,表示移动后的数字
出处:
https://edu.csdn.net/practice/24394332
代码:
#include <stdio.h>
#define N 10000
int main()
int k, a[N], b[N], n, t, w, i;
scanf("%d", &n);
scanf("%d", &k);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < k % n; i++)
b[i] = a[i];
for (i = 0; i < n; i++)
if (i < n - k % n)
a[i] = a[i + k % n];
else
a[i] = b[i - n + k % n];
for (i = 0; i < n; i++)
printf("%d\\n", a[i]);
return 0;
输出:
5↙
2↙
1 2 3 4 5↙
3
4
5
1
2
2. 好数对
已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。
例如,集合A=1 2 3 4,1+2=3,1+3=4,则1,2和1,3 是两个好数对。
编写程序求给定集合中好数对的个数。
注:集合中最多有1000个元素,元素最大不超过10000
示例1:
4↙
1 2 3 4↙
2
示例2:
7↙
2456 3251 654 890 100 754 1234↙
1
其中,“↙”表示输入回车
以下程序实现了这一功能,请你填补空白处内容:
```c++
#include <stdio.h>
#include <stdlib.h>
int main()
int n, i, j, t;
scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
int cout = 0;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
for (t = 0; t < n; t++)
____________;
printf("%d", cout);
free(a);
return 0;
```
出处:
https://edu.csdn.net/practice/24394333
代码:
#include <stdio.h>
#include <stdlib.h>
int main()
int n, i, j, t;
scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
int cout = 0;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
for (t = 0; t < n; t++)
if (a[i] + a[j] == a[t])
cout++;
printf("%d", cout);
free(a);
return 0;
输入输出:
7↙
2456 3251 654 890 100 754 1234↙
1
3. 排序数组中查找元素的首末位置
原标题:在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
进阶:
- 你可以设计并实现时间复杂度为
O(log n)
的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
提示:
0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
nums
是一个非递减数组-10^9 <= target <= 10^9
以下程序实现了这一功能,请你填补空白处内容:
```c++
#include <bits/stdc++.h>
using namespace std;
class Solution
public:
vector<int> searchRange(vector<int> &nums, int target)
vector<int> res;
res.push_back(binary_search_begin(nums, target));
res.push_back(binary_search_end(nums, target));
return res;
private:
int binary_search_begin(vector<int> nums, int target)
int lo = -1;
int hi = nums.size();
while (lo + 1 < hi)
int mid = lo + (hi - lo) / 2;
if (target > nums[mid])
lo = mid;
else
hi = mid;
if (hi == nums.size() || nums[hi] != target)
return -1;
else
return hi;
int binary_search_end(vector<int> nums, int target)
int lo = -1;
int hi = nums.size();
while (lo + 1 < hi)
int mid = lo + (hi - lo) / 2;
______________;
if (lo == -1 || nums[lo] != target)
return -1;
else
return lo;
;
```
出处:
https://edu.csdn.net/practice/24394334
代码:
二分查找,时间复杂度为 O(log n)
#include <bits/stdc++.h>
using namespace std;
class Solution
public:
vector<int> searchRange(vector<int> &nums, int target)
vector<int> res;
res.push_back(binary_search_begin(nums, target));
res.push_back(binary_search_end(nums, target));
return res;
private:
int binary_search_begin(vector<int> nums, int target)
int lo = -1;
int hi = nums.size();
while (lo + 1 < hi)
int mid = lo + (hi - lo) / 2;
if (target > nums[mid])
lo = mid;
else
hi = mid;
if (hi == nums.size() || nums[hi] != target)
return -1;
else
return hi;
int binary_search_end(vector<int> nums, int target)
int lo = -1;
int hi = nums.size();
while (lo + 1 < hi)
int mid = lo + (hi - lo) / 2;
if (target < nums[mid])
hi = mid;
else
lo = mid;
if (lo == -1 || nums[lo] != target)
return -1;
else
return lo;
;
int main()
vector<int> res, nums = 5,7,7,8,8,10;
Solution s;
res = s.searchRange(nums, 8);
cout << "[" << res[0] << ",";
cout << res[1] << "]" << endl;
return 0;
输出:
[3,4]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |
以上是关于C/C++每日一练(20230405)的主要内容,如果未能解决你的问题,请参考以下文章