D361周赛复盘:模拟分割整数⭐+变为整除的最小次数⭐

2023-10-30

2843.统计对称整数的数目(模拟,分割整数为两部分)

给你两个正整数 lowhigh

对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字之和相等,则认为这个数字是一个对称整数。

返回在 [low, high] 范围内的 对称整数的数目

示例 1:

输入:low = 1, high = 100
输出:9
解释:在 1 到 100 范围内共有 9 个对称整数:11、22、33、44、55、66、77、88 和 99 。

示例 2:

输入:low = 1200, high = 1230
输出:4
解释:在 1200 到 1230 范围内共有 4 个对称整数:1203、1212、1221 和 1230 。

提示:

  • 1 <= low <= high <= 10^4

思路

因为本题是计算整数每位数字的和,而整数不能直接用下标访问,所以最好将整数换为字符串用字符串的下标进行每位数字的和累加

字符串是字符数组,而整数并不是数组。

1.整数换成字符串版本

class Solution {
public:
    bool isSymmetic(int num){
        string s = to_string(num);
        if(s.size()%2!=0) return false;

        int firstSum=0,secondSum=0;

        int middle = s.size()/2;//找到中间值

        for(int i=0;i<middle;i++){
            firstSum += s[i] -'0'; //一定要注意这里是字符计算,字符计算要-'0'
            secondSum += s[i+middle]-'0';
        }

        return (firstSum==secondSum)?true:false;
    }

    int countSymmetricIntegers(int low, int high) {
        //返回范围内的所有对称整数的数目,所以需要遍历范围内的所有i
        int cnt=0;
        for(int i=low;i<=high;i++){
            if(isSymmetic(i)){//范围内的每一个i都需要判定
                cnt++;
            }
        }
        return cnt;
    }
};

2.直接用整数的版本

如果不转换为字符串,直接用整数,就需要单独计算整数的位数根据位数分割数字为前半部分和后半部分,用%的操作累加每一位数字。

分割数字为前半部分和后半部分的方法:

int divisor = pow(10,n/2);//n是整数的位数,也就是10的n/2次方,比如4位整数,div=10^2=100
int frontHalf = num/divisor;//直接除法/得到前半部分
int secondHalf = num%divisor;//取模%得到后半部分

div这个数字就是用来分割的,要分割成两部分,所以div = 10^(n/2),前半部分是num/div,后半部分是num%div

分割完成之后再用%运算得到整数每一位数字。

class Solution {
public:
    bool isSymmetic(int num){
        //如果不转为字符串,先算位数
        int n = 0;
        int temp = num;
        while(temp){
            n++; //获取数字位数
            temp/=10;
        }
        if(n%2!=0) return false;

        //分割为前后两部分
        int div = pow(10,n/2);
        int first = num % div;
        int second = num/div;
        int sum1=0,sum2=0;
        for(int i=0;i<div;i++){
            sum1+=first%10;
            sum2+=second%10;
            first /= 10;
            second /= 10;
        }
        return (sum1==sum2)?true:false;

    }

    int countSymmetricIntegers(int low, int high) {
        //返回范围内的所有对称整数的数目,所以需要遍历范围内的所有i
        int cnt=0;
        for(int i=low;i<=high;i++){
            if(isSymmetic(i)){//范围内的每一个i都需要判定
                cnt++;
            }
        }
        return cnt;
    }
};

注意有的时候只过了一个用例需要检查逻辑,很可能是比较大的逻辑错误,比如下面缺了划线的两句:

在这里插入图片描述

2844.生成特殊数字的最小操作(模拟,x能被Num整除的条件)

给你一个下标从 0 开始的字符串 num ,表示一个非负整数。

在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0

返回最少需要多少次操作可以使 num 变成特殊数字。

如果整数 x 能被 25 整除,则该整数 x 被认为是特殊数字。

示例 1:

输入:num = "2245047"
输出:2
解释:删除数字 num[5] 和 num[6] ,得到数字 "22450" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 2 位数字。

示例 2:

输入:num = "2908305"
输出:3
解释:删除 num[3]、num[4] 和 num[6] ,得到数字 "2900" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 3 位数字。

示例 3:

输入:num = "10"
输出:1
解释:删除 num[0] ,得到数字 "0" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 1 位数字。

提示

  • 1 <= num.length <= 100
  • num 仅由数字 '0''9' 组成
  • num 不含任何前导零

思路

本题求的是删成特殊数字的最小次数,重点是x被25整除的等价条件。x能被25整除,那么说明最靠后的位置是00、25、50、75。或者是一个单独的数字0(比如示例3,针对数字位数本来就比较小的情况)

我们可以直接倒序遍历,并且用布尔值记录之前的遍历中有没有碰到可以和当前数字(0/2/5/7)组成一对儿的数。

如果整个遍历完成了,都不存在成对的00/25/50/75,但是有一个0的话,答案就是n-1。(0可以不删掉)

完整版

class Solution {
public:
    int minimumOperations(string num) {

        bool f0 = false,f5=false;
        int n=num.size();
        for(int i=n-1;i>=0;i--){
            if(num[i]=='0'){
                //检查之前有没有0
                if(f0) return n-1-i-1;
                f0 = true; //记录当前的0
            }
            else if(num[i]=='5'){
                if(f0) return n-1-i-1;
                f5 = true; //记录当前的5
            }
            else if(num[i]=='2'||num[i]=='7'){
                if(f5) return n-i-2;
            }
        }
        //所有的遍历都结束之后,都没返回,但是有一个0
        if(f0) return n-1;

        return n;
        
    }
};

总结来说就是要知道x能被num整除的等价条件,然后用布尔值记录倒着遍历过的数字,最后如果都没有但是有一个0,也需要考虑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D361周赛复盘:模拟分割整数⭐+变为整除的最小次数⭐ 的相关文章

随机推荐

  • 用Python写了一个水果忍者小游戏,(入门必备)

    水果忍者的玩法很简单 尽可能的切开抛出的水果就行 今天就用Python简单的模拟一下这个游戏 在这个简单的项目中 我们用鼠标选择水果来切割 同时炸弹也会隐藏在水果中 如果切开了三次炸弹 玩家就会失败 一 需要导入的包 import pyga
  • 如何编辑简单打字游戏

    先来简单看一下要求 一 我们可以先编写Player类 先把属性定义好 然后进行封装 public class Player private String name 定义姓名 private int lvlNo 1 定义级别编号为1 priv
  • 华为OD机试真题- 去除多余空格【2023Q1】【JAVA、Python、C++】

    题目描述 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标 条件约束 1 不考虑关键词起始和结束位置为空格的场景 2 单词的的开始和结束下标保证涵盖一个完整的单词 即一
  • priority_queue 优先队列概念以及常见用法

    目录 1 priority queue简单介绍 2 priority queue代码测试 1 priority queue简单介绍 在优先队列中 元素被赋予优先级 按约定的函数来赋予优先级 底层通过堆来实现 当访问元素时 具有最高优先级的元
  • Pandas小白入门散记(3)---Series.str--源代码定位问题

    文章目录 问题点 原因解释 碰到了 一个错误 debug才定位到问题 记录一下 本次最大收获是 pandas果然代码逻辑复杂 一个小小的异常捕捉 处处是门道 希望本次浅显的代码阅读过程 给你有小小的启发 愿您多读复杂代码 提升自我 问题点
  • Targan 算法[有向图强连通分量]

    有向图强连通分量 在有向图G中 如果两个顶点间至少存在一条路径 称两个顶点强连通 stronglyconnected 如果有向图G的每两个顶点都强连通 称G是一个强连通图 非强连通图有向图的极大强连通子图 称为强连通分量 strongly
  • 标题hadoop源码编译报错

    标题hadoop源码编译报错 最近在学习hadoop的过程中 遇到了许多问题在这里记录下 没想到在源码编译的时候就卡了好久 现在简单说下我的问题 这是我编译hadoop所安装的jar包 网上的教程一搜一大堆 我也是按照文档一步步进行的 没想
  • 机器学习之决策树(实战)

    决策树 什么是决策树 信息增益 熵 基尼指数 熵 基尼指数 CART 算法模型实战 分类树 树的可视化 回归树 总结 什么是决策树 决策树是一种树形结构 其中每个内部节点表示一个属性上的判断 每个分支代表一个判断结果的输出 最后每个叶节点代
  • jpa limit查询_spring data jpa 分页查询

    法一 本地sql查询 注意表名啥的都用数据库中的名称 适用于特定数据库的查询 public interface UserRepository extends JpaRepository Query value SELECT FROM USE
  • 带圈圈的数字1~50,求50以上,不要word的

    带圈圈的数字1 50 求50以上 不要word的 posted on 2018 04 25 16 07 jony413 阅读 评论 编辑 收藏 转载于 https www cnblogs com jony413 p 8945365 html
  • 微信小程序悬浮框实现

    最近在公司负责微信小程序 小程序相比html JavaScript更加简单 很多接口直接就给了 所以我们直接利用就好了 下面说正题 微信小程序悬浮框实现 效果图如下 做了一个随时拨打客服电话的悬浮框 1 第一种 目录结构如下 index j
  • 关于golang性能调试及pprof可视化

    golang支持使用pprof进行可视化性能检测 打开powershell 在需要性能可视化的文件夹下输入 go test bench cpuprofile cpu out 得到一个 out文件 接着输入 go tool pprof cpu
  • 计算机网络知识点汇总(考研用)——第一章:计算机网络体系结构

    计算机网络知识点汇总 考研用 第一章 计算机网络体系结构 本文参考于 2021年计算机网络考研复习指导 王道考研 计算机网络 思维导图 文章目录 计算机网络知识点汇总 考研用 第一章 计算机网络体系结构 1 计算机网络体系结构 1 1 计算
  • 145句经典诗句

    1 知我者 谓我心忧 不知我者 谓我何求 诗经 王风 黍离 释义 了解我心情的人 认为我心中惆怅 不了解我心情的 还以为我呆在这儿有什么要求呢 2 人而无仪 不死何为 诗经风相鼠 释义 人活着如果不重视礼仪 那么就如同死人 3 言者无罪 闻
  • 关于工牌(必须5-10个字)

    今天蹲坑 低头看了下工牌觉得挺有意思 我从啥时候起也不排斥将工牌挂在脖子上了 工牌 一个标识 不仅标识了你 也标识了你所在的群体 如果你认可这个群体 佩戴它那是一种荣誉 荣耀 如果你不认可这个群体 佩戴它就是耻辱 羞辱 尤其挂到脖子上 那不
  • 使用机器学习算法预测航班价格

    一 前言 机票价格的预测一直是航空业和旅行者关注的重要问题之一 随着航空业的快速发展和市场竞争的加剧 正确预测机票价格对于航空公司的利润最大化和旅行者的预算规划至关重要 在过去 人们通常依靠经验和市场趋势来预测机票价格 但这种方法往往存在不
  • Qt宏定义

    1 QT BEGIN NAMESPACE 在qglobal h中 我们可以看到以下两句胡宏定义 define QT BEGIN NAMESPACE namespace QT NAMESPACE define QT END NAMESPACE
  • Java中有关锁的面试题

    sychronized修饰普通方法和静态方法的区别 什么是可见性 对象锁是用于对象实例方法 或者一个对象实例上的 类锁是用于类的静态方法或者一个类的class对象上的 类的对象实例可以有很多个 但是每个类只有一个class对象 所以不同对象
  • 静态成员(static)

    今天整理了一下关于静态的一些知识点 可能有些没有整理到 或者理解有纰漏 大家不妨看看 不足之处 恳请大家斧正 在静态类中 静态类中不能调用非静态类的实例成员 静态类中不能有非静态构造函数 但是可以有静态构造函数 静态构造函数也可以存在于非静
  • D361周赛复盘:模拟分割整数⭐+变为整除的最小次数⭐

    文章目录 2843 统计对称整数的数目 模拟 分割整数为两部分 思路 1 整数换成字符串版本 2 直接用整数的版本 2844 生成特殊数字的最小操作 模拟 x能被Num整除的条件 思路 完整版 2843 统计对称整数的数目 模拟 分割整数为