每周一算法2017.12.8

Self Dividing Numbers

A self-dividing number is a number that is divisible by every digit it contains.
For example, 128 is a self-dividing number because 128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0.
Also, a self-dividing number is not allowed to contain the digit zero.
Given a lower and upper number bound, output a list of every possible self dividing number, including the bounds if possible.
Note:
The boundaries of each input argument are 1 <= left <= right <= 10000.

描述

自分数就是可以整除的数字中每一位数的那个数。 例如,128就是一个自分数,因为128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0。 当然,由此判断自分数中不含有数字0。 给定一个下界和上界,输出一个自分数的数组,如果可能的话,包括边界。 注意: 输入的范围1 <= left <= right <= 10000

分析

遍历给定边界的数组,对每个数字进行判断,符合要求的放到要返回的数组。 获取每位上的数字,判断是否能被整除,注意不能为零。

时间复杂度

复杂度为O(mn),m=right -left,n是for循环里面循环次数

Java

class Solution {  
   public List<Integer> selfDividingNumbers(int left, int right) {
      List<Integer> list = new ArrayList<Integer>();
      for (int num = left;num<=right;num++) {
          if (isSelfDividingNumber(num)) {
             list.add(num);
          }
       }
      return list;
   }
   public boolean isSelfDividingNumber(int num) {
      int n=num;
      while(n>0){
         if (n%10 == 0 || num%(n%10) != 0) {
             return false;
         }
         n/=10;
      }
      return true;
    }
}

C++

class Solution {

public:  
    vector<int> selfDividingNumbers(int left, int right) {
        vector<int> vec ;
        for(int i = left; i <= right ; i++){
            bool flag = true ;
            int t = i ;
            while(t){
                int d = t%10 ;
                if (d == 0 || i%d ){
                    flag = false ;
                    break ;
                }
                t /= 10 ;
            }
            if (flag)
                vec.push_back(i) ;
        }
        return vec ;
    }
};

Swift

class Solution {

     func selfDividingNumbers(_ left: Int, _ right: Int) -> [Int] {
        var arr:[Int] = []
        for i in left...right {
            if isSelfDivingNumber(num: i) {
                arr.append(i)
            }
        }
        return arr
    }

    func isSelfDivingNumber(num:Int) -> Bool {
        var temp = num
        var div = 0
        while temp > 0 {
            div = temp % 10
            if div == 0 {
                return false
            } else if num%div != 0 {
                return false
            } else {
                temp = temp/10
            }
        }
        return true
    }
 }

本题来自LeetCode

comments powered by Disqus