首页 > 其他分享 >788. 旋转数字

788. 旋转数字

时间:2022-09-25 16:01:05浏览次数:51  
标签:1021 好数 int 复杂度 788 旋转 pd 102 数字

解题思路

  • 利用前面已经求出的数来判断后续数据是否为好数,将现在要查的数分为前面几位和最后一位

约规

  • 0、1、8为普通数,在pd中为0,而2、5、6、9为好数,在pd中为1,而其余为坏数,在pd中为-1;

举例

  • 例如将1021:分为102和1,通过判断102和1是否为好数来判断1021是否为好数
    • 若102和1中有任一数为好数,则1021为好数;
    • 若102和1中有任一数为坏数,则1021为坏数;
    • 而只有当102和1均为普通数时,1021为普通数
    • (上述1021为好数,只是举个例子)

初始化

  • 通过打表写出得出10是好数/坏数,并且赋值给 pd 数组
    int[] pd=new int[10001];
    pd[0]=0;
    pd[1]=0;
    pd[2]=1;
    pd[3]=-1;
    pd[4]=-1;
    pd[5]=1;
    pd[6]=1;
    pd[7]=-1;
    pd[8]=0;
    pd[9]=1;
  • 这里创建数组使用 10001 ,导致空间复杂度非常不优秀,而如果使用 n+1 会导致触发当输入n为个位数时的数组越栈,改进的话对n为个位数的数据进行改进,这里谨给出个人打表想法,并没有试验:
    if(n<10)
    {
        switch(n)
        {
            case 0:return 0;
            case 1:return 0;
            case 2:return 1;
            case 3:return 1;
            case 4:return 1;
            case 5:return 2;
            case 6:return 3;
            case 7:return 3;
            case 8:return 3;
            case 9:return 4;
        }
    }
    int[] pd=new int[n+1];

代码

  • 完整代码:(未对空间复杂度优化)
public class Solution {
    public int RotatedDigits(int n) {
        int[] pd=new int[10001];
        pd[0]=0;
        pd[1]=0;
        pd[2]=1;
        pd[3]=-1;
        pd[4]=-1;
        pd[5]=1;
        pd[6]=1;
        pd[7]=-1;
        pd[8]=0;
        pd[9]=1;
        for(int i=10;i<=n;i++)
        {
            int a=i/10;
            int b=i%10;
            if(pd[a]==-1)
            {
                pd[i]=-1;
            }
            
            if(pd[a]==1)
            {
                if(pd[b]==-1)
                {
                    pd[i]=-1;
                }
                if(pd[b]==1)
                {
                    pd[i]=1;
                }
                if(pd[b]==0)
                {
                    pd[i]=1;
                }
            }
            if(pd[a]==0)
            {
                if(pd[b]==-1)
                {
                    pd[i]=-1;
                }
                if(pd[b]==1)
                {
                    pd[i]=1;
                }
                if(pd[b]==0)
                {
                    pd[i]=0;
                }
            }
        }
        int sum=0;
        for(int i=0;i<=n;i++)
        {
            if(pd[i]==1)
            {
                sum++;
            }
        }
        return sum;
    }
}

复杂度分析:

  • 时间复杂度为O(n),只有遍历
  • 空间复杂度为O(10001),直接创建dp为10001大小的数组
    ZBRH{S93HCV3(D}6@(@LXTL.png

标签:1021,好数,int,复杂度,788,旋转,pd,102,数字
From: https://www.cnblogs.com/bzxf/p/16728014.html

相关文章

  • ArcGIS 修改属性字段类型 字符串转数字
    https://www.docin.com/p-58631989.htmlhttps://support.esri.com/zh-cn/technical-article/000002287......
  • 报告分享|2022年中国人力资源数字化研究报告
     报告链接:http://tecdat.cn/?p=28641受数字经济,疫情常态化、人口老龄化等社会因素,以及云计算等技术因素驱动影响,企业越来越注重人力资源数字化管理,力求盘活人力资源管理......
  • 报告分享|新国货美妆品牌数字营销系列研究报告
    报告链接:http://tecdat.cn/?p=28631过去一年,国货崛起成为了势不可挡的消费潮流。供给侧,以移动互联网、大数据、云计算等作为基础,消费供应链不断完善,再加上外资品牌对国货......
  • 报告分享|2022快消品行业线下分销链路数字化转型
     报告链接:http://tecdat.cn/?p=28643报告就以下问题展开讨论:1.中国快消品行业在快速发展的过程中到底发生了哪些新的调整?2.整个行业的持续发展依然重度依赖线下分销链......
  • 力扣算法之数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:输入:[1,2,3,2,2,2,5,4,2]输......
  • 数字化转型需要经历哪些步骤?
    数字化转型大致分为下列五个步骤:1、首当其冲的是战略上的转型!客观来讲,数字化转型实际上是“一把手”的一场自我革命之旅,“一把手”要有自我否定的勇气,摒弃路径依赖,重塑......
  • 为什么数字化转型离不开 MES 系统?
    确切的说应该是制造业企业的数字化转型离不开MES系统,原因很简单,制造业企业的核心工作是生产制造,做数字化转型就是对生产制造各个环节进行数字化改造,提质增效降成本,而MES系......
  • 【code基础】求每位数字之和
    对一个n位数求和,如12345,求每位数字之和,应该输出15//求和的经典操作://1.定义基本sum=0,在num!=0之前做如下循环://2.先取低位值相加,即sum=sum+num%10//3.nu......
  • 【数字通信】高速信号编码之XXB/XXB
    对于NRZ数据编码方式,有4B/5B,8B/10B,64B/66B,64/67B,128B/130B,128B/132B编码等等,不同的编码方式针对不同的信号协议,导致的效率也是不同的。什么是效率?在数据包传送的......
  • 报告分享|2022汽车行业数字化转型白皮书
    全文链接:http://tecdat.cn/?p=28703受疫情影响,消费者购车行为偏好发生变化,以数字化、智能化手段洞察用户、进行精细化运营,以驱动汽车消费需求增长,成为车企迫在眉睫的诉求......