【模拟】特别数的和、移动距离、连号区间、错误票据思路详解及代码实现

简介: 取出最后一位,然后将n除去最后一位,将刚刚取出的进行判定。

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈


6a15468c3a5b4f649f372ddb73ce57e1.jpg


题目:特别数的和


e2ad1db477d74e139e50d8b59c3c70a7.png


题解:


在一到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;
}


题目:移动距离


dfcb7ca6e689412e9d032715f4b2672e.png


题解:


整个楼的房号成s形排布,在给定宽度后要求出任意两个房号间的距离。


蓝桥杯中经常考的距离有两种:一种是曼哈顿距离,即两点间的相对路径(abs(x2-x1)+abs(y2-y1))

另一种为欧几里得距离也称欧式距离,即两点间的绝对距离(sqrt((x1-x2)^2+(y1-y2)^2))


eec879683cc94e5c8cde0016aef30149.jpg


这题要求不能走斜线,所以显然为曼哈顿距离.


那么怎么来求呢?有一个较为通用的想法 ,将数组对正成下标0开始,也就是将所有下标减去1.


这样所求行号就等于,房号直接除以宽度.

再来处理下列号:观察当行号为偶数的时候,这列数字是正向的,当行号为奇数的时候,这列数字是逆向的,我们可以先按正向求解,之后特判一下.观察上图可以发现,列号就等于该数字取模宽度.


当行号为奇数时,用宽度-1-刚刚算出来的列号即可


658fa7e6ee5948b2a26887de7e5b5c5e.jpg


代码实现:


#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);
}


题目:连号区间


9f86a8fb8fb44a16bbc117d604e31304.png


题解:


连号区间的定义为:给出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


题目:错误票据


fc09da897125439fb9233f23b8de668e.png


题解:


这题题意十分的简单,找出一段连续数字中重复出现的那个数字与没有出现的那个数字,难得是处理输入.


这里只给了输入行数,但并没有给一行输入几个数字.


所以我们要用到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;
}


完结撒花:


🌈本篇博客的内容【】已经结束。


🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!

目录
相关文章
|
5月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
6月前
|
机器学习/深度学习 算法
【算法 | 实验7】以最小的步骤收集所有硬币(算法正确性还没想清楚)
题目 最小步骤收集硬币 有许多相邻排列的硬币堆。我们需要以最少的步骤收集所有这些硬币,在一个步骤中,我们可以收集一个水平线的硬币或垂直线的硬币,收集的硬币应该是连续的。 输入描述 输入第一行整数N表示硬币堆的数量
74 0
|
6月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
11月前
|
算法 测试技术 C#
C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例
C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例
|
算法 C++
程序自动分析(并查集加离散化)
程序自动分析(并查集加离散化)
55 0
程序自动分析(并查集加离散化)
算法训练Day38|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
算法训练Day38|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
|
算法 前端开发
前端算法-寻找重复数
前端算法-寻找重复数
练习>>代码实现5*5数组的交叉线上数字之和(中间的那个数只需要计算一次)
练习>>代码实现5*5数组的交叉线上数字之和(中间的那个数只需要计算一次)
46 0
|
存储 算法
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
时间复杂度:O(q * (m + n) + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数,遍历 indices 数组都要更新一次行列,总共需要O(q * (m + n))的时间,最后遍历一次矩阵,总共需要O(m * n)的时间
62 0
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
|
算法 索引
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
97 0
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水