• 788. Rotated Digits


    X is a good number if after rotating each digit individually by 180 degrees, we get a valid number that is different from X.  Each digit must be rotated - we cannot choose to leave it alone.

    A number is valid if each digit remains a digit after rotation. 0, 1, and 8 rotate to themselves; 2 and 5 rotate to each other; 6 and 9 rotate to each other, and the rest of the numbers do not rotate to any other number and become invalid.

    Now given a positive number N, how many numbers X from 1 to N are good?

    Example:
    Input: 10
    Output: 4
    Explanation: 
    There are four good numbers in the range [1, 10] : 2, 5, 6, 9.
    Note that 1 and 10 are not good numbers, since they remain unchanged after rotating.

    c++代码

    每个数字逐一判断各个位置

    class Solution {
        enum {
            S,V,I //Same: 0 1 8 Valid:2 5 6 9 Invalid:3 4 7
        };
    public:
        int rotatedDigits(int N) {
            int i,num,count=0;
            int is_valid[]={S,S,V,I,I,V,V,I,S,V};
            bool found=false;
            for(int i=2;i<=N;i++){
                num=i;found=false;
                while(num){
                    if(is_valid[num%10]==I){found=false;break;}
                    if(is_valid[num%10]==V) found=true;
                    num=num/10;
                }
                if(found==true) count++;
            }
            return count;     
        }
    };

     动态规划

    /*
    dp[i] = 0, invalid number
    dp[i] = 1, valid and same number
    dp[i] = 2, valid and different number
    */
    class Solution {
    public:
        int rotatedDigits(int N) {
            vector<int> dp=vector<int>(N+1,0);
            int count=0;
            for(int i=0;i<=N;++i)
            {
                if(i<10)
                {
                    if(i==0 || i==1 || i==8) dp[i]=1;
                    else if(i==2 || i==5 || i==6 || i==9)
                    {
                        dp[i]=2;
                        count++;
                    }
                }
                else
                {
                    int a=dp[i/10],b=dp[i%10];
                    if(a==1 && b==1) dp[i]=1;
                    else if (a>=1 && b>=1)
                    {
                        dp[i]=2;
                        count++;
                    }
                }
            }
            return count;
             
        }
    };

     python代码

    class Solution(object):
        def rotatedDigits(self, N):
            """
            :type N: int
            :rtype: int
            """
            dp=[0 for _ in xrange(N+1)]
            cnt=0
            for i in xrange(N+1):
                if i<10:
                    if i==3 or i==4 or i==7:
                        dp[i]=0 #invalid
                    if i==0 or i==1 or i==8:
                        dp[i]=1 #same
                    if i==2 or i==5 or i==6 or i==9:
                        dp[i]=2 #valid
                else:
                    dp[i]=min(dp[i%10]*dp[i/10],2)
                
                if dp[i]==2: 
                    cnt+=1
            return cnt;
            
  • 相关阅读:
    关于抑或
    【vue】条件渲染 v-if v-else
    【vue】vue的目录结构、项目流程、vue-router
    【vue】在vue中引入iview
    【vue】vue如何创建一个项目
    【jquery】jquery怎么实现点击一个按钮控制一个div的显示和隐藏
    【angularjs】ng-model controller中取不到值(input)
    打印机增强软件pdfpro
    vagrant 安装ubuntu12.04 64 bit
    debian 7 stable 不能编译android源码
  • 原文地址:https://www.cnblogs.com/learning-c/p/9271552.html
Copyright © 2020-2023  润新知