攻击网站步骤,正能量不良网站推荐2020,媒体:多地新增感染趋势回落,网站建设行业分析报告双指针 常⻅的双指针有两种形式#xff0c;⼀种是对撞指针#xff0c;⼀种是左右指针。 对撞指针#xff1a;⼀般⽤于顺序结构中#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始#xff0c;另⼀个从最右端开始#xff0c;然后逐渐往中间逼…双指针
常⻅的双指针有两种形式⼀种是对撞指针⼀种是左右指针。 对撞指针⼀般⽤于顺序结构中也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始另⼀个从最右端开始然后逐渐往中间逼 近。 • 对撞指针的终⽌条件⼀般是两个指针相遇或者错开也可能在循环内部找到结果直接跳出循 环也就是 ◦ left right 两个指针指向同⼀个位置 ◦ left right 两个指针错开 快慢指针⼜称为⻳兔赛跑算法其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列 结构上移动。 这种⽅法对于处理环形链表或数组⾮常有⽤。 其实不单单是环形链表或者是数组如果我们要研究的问题出现循环往复的情况时均可考虑使⽤快 慢指针的思想。 快慢指针的实现⽅式有很多种最常⽤的⼀种就是 • 在⼀次循环中每次让慢的指针向后移动⼀位⽽快的指针往后移动两位实现⼀快⼀慢。 1. 移动零easy
「数组分两块」是⾮常常⻅的⼀种题型主要就是根据⼀种划分⽅式将数组的内容分成左右两部 分。这种类型的题⼀般就是使⽤「双指针」来解决。 1. 题⽬链接283. 移动零 2. 题⽬描述 给定⼀个数组 nums 编写⼀个函数将所有 0 移动到数组的末尾同时保持⾮零元素的相对顺 序。 请注意 必须在不复制数组的情况下原地对数组进⾏操作。 ⽰例 1: 输⼊: nums [0,1,0,3,12] 输出: [1,3,12,0,0] ⽰例 2: 输⼊: nums [0] 输出: [0] 思路用cur指针扫描整个数组另一个dest指针记录非零序列最后一个位置根据cur扫描过程分类划分实现数组的划分这样使得[0,dest]都是非0元素[dest1cur-1]都是0. 具体实现 class Solution {
public:void moveZeroes(vectorint nums) {int cur 0;int dest -1;while(curnums.size()){if(nums[cur]!0){dest;swap(nums[cur],nums[dest]);}cur;}}
};核心思路就是选用cur指向第一个元素的左边第一个元素让dset往右边扫描遇到0就走遇到非零停然后让cur目的是让他指向0然后交换循环的条件是curnums.size()直到最后一个元素为止。 第一题阶乘求和
思路
遍历n然后item来存放每一项并且后一项是在前一项的基础上进行相乘值得说的是这里你定义的变量不能是int否则不能拿满分原因是int类型包含的范围小当n很大的时候阶乘之和可能超过这个范围导致发生溢出因此应该用更大数据类型如long long类型
#include iostream
using namespace std;// 计算阶乘
long long factorial(int n) {long long result 1;for (int i 1; i n; i) {result * i;}return result;
}int main() {int n;cin n;long long sum 0;for (int i 1; i n; i) {sum factorial(i);}cout sum;return 0;
}第二题完数的判断
分析
找出n内所有完数那么就先遍历n,定义一个变量sum对它的因子进行求和因为因子是变化的这里这里定义一个数组将其全部存起来然后判断sum与i是否相等输出即可
#includestdio.h
void PerfNumber(int n);
int main()
{int N;scanf(%d,N);PerfNumber(N);
}
void PerfNumber(int n)
{for(int i2;in;i){int sum0,k0;int a[100]{0};for(int j1;ji;j){if(i%j0){sumj;a[k]j;k;}}if(sumi){k0;printf(%d its factors are ,i);while(a[k]){printf(%d ,a[k]);k;} printf(\n);}}return;
}
第三题字符串的输入输出处理
思路
解决这道题还是用istringstream来处理并且定义了一个函数来实现字符串的切割。更方便处理字符串流的文本并且注意当读取n的时候要把末尾\n给去掉可以用getchar也可以用cin.ignore(),然后是多组输入这里用一个while循环即一直读取str当小于n时原样输出大于时输出字符串流。
#include iostream#include string#include sstream#include vectorusing namespace std;void stringSplit(string str); //这里加不加const都行加上是因为编程习惯这个符号在函数中不能修改
int main() {int n, i 0;string str;cin n;getchar();while (getline(cin, str)) {if (i n) {cout str endl endl;}else {stringSplit(str);}}
return 0;
}void stringSplit(string str) {istringstream iss(str);string receive;while (iss receive){cout receive endl endl;}}
第四题:线性筛求素数了解即可 思路这里用线性筛给大家实现线性筛比普通遍历的方法效率更高当处理一些比较麻烦的数据时线性筛的作用就发挥出来了核心在于去重有兴趣博友可以去b站搜一下具体的讲解这里不做阐述。
#includebits/stdc.h
using namespace std;
//int isprime(int n);
const int maxn 1e6;
int prime[maxn 1];//放素数
bool isprime[maxn 1];
int cnt 0;//素数个数
void linesieve(int n)
{memset(isprime, true, sizeof(isprime));//全部弄成truefor (int i 2; i n; i){//遍历所有if (isprime[i]){prime[cnt] i;}for (int j 1; j cnt prime[j] * i n; j){isprime[prime[j] * i] false;if (i % prime[j] 0)break;}}for (int i 2; i n; i){if (isprime[i])cout i endl;}
}
int main()
{int m;cin m;linesieve(m);return 0;
}
第五题自定义函数处理最大公约数与最小公倍数
思路
题目很简单但也是基础说不定就考了呢这里介绍辗转相除法求最大公约数和简单自增来求最小公倍数。求最大公倍数首先要知道最大公倍数一定比这两个数都大因此我们从ab种大的数开始自增直到这个数都能整除ab返回值即可。辗转相除法有兴趣去b站学一下这里不做阐述给出代码即先定义mod每次循环把b赋给a把mod赋给b直到b等于0跳出循环。
#includebits/stdc.h
using namespace std;
int gcd(int a, int b);
int ret(int a, int b);
int main()
{int a, b;cin a b;int gcd1 gcd(a, b);int ret1 ret(a, b);cout gcd1 ret1;return 0;
}
int gcd(int a, int b)
{int mod;while (b){mod a % b;a b;b mod;}return a;
}
int ret(int a, int b)
{if (a b)swap(a, b);//确保a最大int i;for (i a;; i){if (i % a 0 i % b 0)break;}return i;
}
第六题蓝桥杯2022-刷题统计
思路
这道题虽然我只有80分但还是想给大家介绍80 分的做法就是学习这种分析一步步整。首先我们要输出做题天数并且周一到周五的做题量和周六周日不同那么分开考虑n为总题量我们定义一个计数器然后循环条件为n0.如果n0跳出循环先遍历一周i5就每次n-a并且在减之前判断n是否0即可。
#includebits/stdc.h
#pragma warning(disable:4996)
using namespace std;
const int N 2022;
int main()
{long long a, b, n;scanf(%lld %lld %lld, a, b, n);int cnt 0;while (n0){for (int i 0; i 7; i){if (i 5){if (n 0)break;else{n n - a;cnt;}}else{if (n 0)break;else{n n - b;cnt;}}}if (n 0)break;}cout cnt;return 0;
}
第七题输出矩阵 分析这个题比较抽象方法也很多这里给大家介绍一种很好理解的就是先遍历二维数组先全部放一个字母然后通过控制层数行数列数再来另一个字母来覆盖我们已经设置的字母。比方说
假设输入的N为3那么我们需要生成一个大小为5x5的矩阵。下面是每一层中填充字符的过程第0层填充字符A
layer 0范围是从第0行到第4行从第0列到第4列。
A A A A A
A A A A A
A A A A A
A A A A A
A A A A A
第1层填充字符B
layer 1范围是从第1行到第3行从第1列到第3列。
A A A A A
A B B B A
A B B B A
A B B B A
A A A A A
第2层填充字符C
layer 2范围是第2行第2列。
A A A A A
A B B B A
A B C B A
A B B B A
A A A A A
这样通过不断递增layer和字符ch的方式我们可以在每一层中正确地填充相应的字符。每次内层循环都会覆盖上一层填充的字符所以最后得到了符合要求的矩阵。
即layer是来控制层级从最外层到最内层结束每一层使用两个嵌套循环i和j来遍历i控制行从layer开始到n*2-1-layer-1结束在每个位置(i, j)处将字符ch赋值给matrix[i][j]完成对该层的字符填充。接着逐渐增加字符ch的值以便在下一层填充不同的字符。通过这种方式代码会按照层级从外到内的顺序依次填充不同的字符。
#include iostream
using namespace std;int main() {int N;cin N; // 输入Nchar matrix[101][101];// 初始化矩阵for (int i 0; i N * 2 - 1; i) {for (int j 0; j N * 2 - 1; j) {matrix[i][j] Z;}}// 填充字符char ch A;for (int layer 0; layer N; layer) {for (int i layer; i N * 2 - 1 - layer; i) {for (int j layer; j N * 2 - 1 - layer; j) {matrix[i][j] ch;}}ch;}// 输出矩阵for (int i 0; i N * 2 - 1; i) {for (int j 0; j N * 2 - 1; j) {cout matrix[i][j];}cout endl;}return 0;
}第八题平方矩阵 思路乘热打铁与上题类似这道题应该如何处理
#include iostream
using namespace std;int main()
{int N;while (cin N, N){int matrix[101][101];// 初始化矩阵for (int i 0; i N; i) {for (int j 0; j N; j) {matrix[i][j] 1;}}// 填充字符int ch 1;for (int layer 0; layer N; layer){for (int i layer; i N - layer; i){for (int j layer; j N - layer; j){matrix[i][j] ch;}}ch;}// 输出矩阵for (int i 0; i N; i) {for (int j 0; j N; j) {cout matrix[i][j] ;}cout endl;}}return 0;
}