zoukankan      html  css  js  c++  java
  • 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,写任何解法前,计算其时间复杂度。

  • 相关阅读:
    会议记录补充5月9日
    会议记录补充5月11日
    每日会议记录5月6日
    SQL Server 日期函数
    Jvascript运算符
    For循环
    JS数据类型
    初识Javascript
    检测浏览器版本(综合整理)
    自己实现一个数组的slice方法
  • 原文地址:https://www.cnblogs.com/hzg1981/p/8970688.html
Copyright © 2011-2022 走看看