Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
题目:特别数的和
题解:
在一到N中,求所有含有2、0、1、9的数字的和是多少。十分简单,枚举出1-N的所有数字,将其拆开,若含有目标数字则将其加到答案中。
取出最后一位,然后将n除去最后一位,将刚刚取出的进行判定。
代码实现:
#include<iostream> using namespace std; int main() { int h=0; cin>>h; int n=0; int res=0; for(int i=1;i<=h;i++) { n=i; while(n) { int t=n%10; n/=10; if(t==2||t==0||t==1||t==9) { res+=i; break; } } } cout<<res<<endl; }
题目:移动距离
题解:
整个楼的房号成s形排布,在给定宽度后要求出任意两个房号间的距离。
蓝桥杯中经常考的距离有两种:一种是曼哈顿距离,即两点间的相对路径(abs(x2-x1)+abs(y2-y1))
另一种为欧几里得距离也称欧式距离,即两点间的绝对距离(sqrt((x1-x2)^2+(y1-y2)^2))
这题要求不能走斜线,所以显然为曼哈顿距离.
那么怎么来求呢?有一个较为通用的想法 ,将数组对正成下标0开始,也就是将所有下标减去1.
这样所求行号就等于,房号直接除以宽度.
再来处理下列号:观察当行号为偶数的时候,这列数字是正向的,当行号为奇数的时候,这列数字是逆向的,我们可以先按正向求解,之后特判一下.观察上图可以发现,列号就等于该数字取模宽度.
当行号为奇数时,用宽度-1-刚刚算出来的列号即可
代码实现:
#include<iostream> #include<math.h> using namespace std; int w,m,n; int main() { cin>>w>>m>>n; m--,n--; int x1=m/w; int x2=n/w; int y1,y2; if(x1%2!=0)y1=w-1-m%w; else y1=m%w; if(x2%2!=0)y2=w-1-n%w; else y2=n%w; cout<<abs(x1-x2)+abs(y1-y2); }
题目:连号区间
题解:
连号区间的定义为:给出L与R,若能得到一个在L与R范围内连续的递增数列,则为连号区间.
先看看第一个样例,7个分别为[3][2][4][1] [2,3] [2,3,4] [1 2 3 4]
[1 2 4]就不是,因为其不连续.
观察我们发现,若一个区间想要连续,其必满足,最大值减去最小值等于元素个数.
所以这题就结束了
通过双指针,外层循环为左端点,内层循环为右端点.
代码实现:
#include<iostream> #include<algorithm> using namespace std; const int N=10010; int a[N]; int main() { int n=0; cin>>n; int res=0; for(int i=0;i<n;i++)cin>>a[i]; for(int i=0;i<n;i++) { int max_=-2e6,min_=2e6; for(int j=i;j<n;j++) { max_=max(max_,a[j]); min_=min(min_,a[j]); if(max_-min_==j-i)res++; } } cout<<res<<endl; } //max
题目:错误票据
题解:
这题题意十分的简单,找出一段连续数字中重复出现的那个数字与没有出现的那个数字,难得是处理输入.
这里只给了输入行数,但并没有给一行输入几个数字.
所以我们要用到getline行数,直接读入这一行.,用getline有一个需要处理的点,因为读入行数得时候用的是cin,所以回车并没有被读入,还在缓冲区中,所以要先处理下回车.
之后在用stringstream创建一个对象ssin,将刚刚读入的lin格式化输入到数组中,至此数据处理完毕.
关于stringstream有点类似sscanf,这里也可以用sscanf来写
之后将所有数据排序,找没有出现的数字与连续出现过两次的数字即可.
代码实现:
#include<sstream> #include<iostream> #include<algorithm> #include <string> using namespace std; const int N=1e5+10; int n,a[N]; int main() { int cnt=0; cin>>cnt; string line; int n=0; getline(cin,line); while(cnt--) { getline(cin,line); stringstream ccin(line); while(ccin>>a[n])n++; } sort(a,a+n); int res1=0,res2=0; for(int i=1;i<n;i++) { if(a[i]==a[i-1])res1=a[i]; else if(a[i]>=a[i-1]+2)res2=a[i]-1; } cout<<res2<<" "<<res1; }
完结撒花:
🌈本篇博客的内容【】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!