• LeetCode 788. Rotated Digits


    question:

    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.
    
    Note:
    
        N  will be in range [1, 10000].

    try:

    class Solution {
        public int rotatedDigits(int N) {
            int counts=0;
            for(int i=1;i<=N;i++){
                counts=valid(i)? counts+1:counts;
            }
            return counts;
        }
        
        public boolean valid(int n){
            ArrayList<Integer> digitsList = new ArrayList<Integer>();
            while(n!=0){
                digitsList.add(n%10);
                n=n/10;
                
            }
            
            boolean contains = false;
            for(Integer integer:digitsList){
                if(integer.equals(3)||integer.equals(4)||integer.equals(7)){
                    return false;
                }
                if(integer.equals(2)||integer.equals(5)||integer.equals(6)||integer.equals(9)){
                    contains=true;
                }
                //return false;
            }
            return contains;
        }
    }

    result:

    re-try:

    class Solution {
        public int rotatedDigits(int N) {
            int counts=0;
            for(int i=1;i<=N;i++){
                counts=valid(i)? counts+1:counts;
            }
            return counts;
        }
        
        public boolean valid(int n){
           
            String s=((Integer)n).toString();
            char[] charArray = new char[s.length()];
            for(int i=0;i<s.length();i++){
                charArray[i]=s.charAt(i);
            }
            
            boolean contains = false;
            for(char c:charArray){
                if(c=='3'||c=='4'||c=='7'){
                    return false;
                }
                if(c=='2'||c=='5'||c=='6'||c=='9'){
                    contains=true;
                }
                //return false;
            }
            return contains;
        }
    }

    result:

    conclusion:

    效率很低,n2.

    看讨论区里的posts,发现主要问题在于对于n和n+1,我的方法是重新计算n+1是否good,浪费。如果使用dp,可以利用n是否good这个结论,从而降低复杂度。 讨论区里面还有一个lgn的dfs解法。

    时间有限,留作以后优化。

    心得2,写任何解法前,计算其时间复杂度。

  • 相关阅读:
    Bootstrap标签(label)的使用
    Docker学习(二)
    linux 的tee命令
    解决 Docker pull 出现的net/http: TLS handshake timeout 的一个办法
    win 10 安装.msi 程序出现the error code is 2503
    Kbuntu16.04利用快捷键调用终端Konsole
    ubuntu上swift开发学习2
    ubuntu上swift开发学习1
    Linux中常用文件传输命令及使用方法
    Kbuntu16.04添加工作空间
  • 原文地址:https://www.cnblogs.com/hzg1981/p/8970688.html
Copyright © 2020-2023  润新知