[Swift]LeetCode869. 從新排序獲得 2 的冪 | Reordered Power of 2

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: http://www.javashuo.com/article/p-yujqtakx-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Starting with a positive integer N, we reorder the digits in any order (including the original order) such that the leading digit is not zero.git

Return true if and only if we can do this in a way such that the resulting number is a power of 2. github

Example 1:微信

Input: 1
Output: true 

Example 2:app

Input: 10
Output: false 

Example 3:this

Input: 16
Output: true 

Example 4:spa

Input: 24
Output: false 

Example 5:code

Input: 46
Output: true 

Note:htm

  1. 1 <= N <= 10^9

從正整數 N 開始,咱們按任何順序(包括原始順序)將數字從新排序,注意其前導數字不能爲零。blog

若是咱們能夠經過上述方式獲得 2 的冪,返回 true;不然,返回 false。 

示例 1:

輸入:1
輸出:true

示例 2:

輸入:10
輸出:false

示例 3:

輸入:16
輸出:true

示例 4:

輸入:24
輸出:false

示例 5:

輸入:46
輸出:true 

提示:

  1. 1 <= N <= 10^9

Runtime: 8 ms
Memory Usage: 18.6 MB
 1 class Solution {
 2     func reorderedPowerOf2(_ N: Int) -> Bool {
 3         var c:Int = counter(N)
 4         for i in 0..<32
 5         {
 6             if counter(1 << i) == c
 7             {
 8                 return true
 9             }
10         }
11         return false
12     }
13 
14     func counter(_ N:Int) ->Int
15     {
16         var N = N
17         var res:Int = 0
18         while(N > 0)
19         {
20             res += Int(pow(10, Double(N % 10)))
21             N /= 10
22         }
23         return res
24     }
25 }

12ms

 1 class Solution {
 2     func reorderedPowerOf2(_ N: Int) -> Bool {
 3          let a = count(N);
 4         for i in 0...31 {
 5             if a.elementsEqual(count(1 << i)) {
 6                 return true;
 7             }
 8         }
 9       return false;
10 }
11     
12     func count(_ N: Int) -> [Int] {
13         var n = N
14         var ans =  [Int](repeating: 0, count: 31)
15         while (n > 0) {
16             let indx = n % 10;
17             ans[indx] = ans[indx] + 1;
18             n /= 10;
19         }
20         return ans
21     }
22 }

16ms

 1 class Solution {
 2 
 3     let pows2 = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912]
 4     var dictArr = [Int: [[Character: Int]]]()
 5 
 6     init() {
 7         for n in pows2 {
 8             let s = String(n)
 9             let val = toStringDict(n)
10             if let arr = dictArr[s.count] {
11                 var varArr = arr
12                 varArr.append(val)
13                 dictArr[s.count] = varArr
14             } else {
15                 dictArr[s.count] = [val]
16             }
17         }
18     }
19 
20     func reorderedPowerOf2(_ N: Int) -> Bool {
21         return dictArr[String(N).count]?.contains(toStringDict(N)) ?? false
22     }
23 
24     func toStringDict(_ n: Int) -> [Character : Int] {
25         let s = String(n)
26         var dict: [Character : Int] = [:]
27         for char in s.characters {
28             if let val = dict[char] {
29                 dict[char] = val + 1
30             } else {
31                 dict[char] = 1
32             }
33         }
34         return dict
35     }
36 }

28ms

 1 class Solution {
 2     func reorderedPowerOf2(_ N: Int) -> Bool {
 3     if N == 1 {return true}
 4     var set = [String]()
 5     let stirng = String("\(N)".sorted(by: >))
 6     let max = Int(stirng)!
 7     for i in 1... {
 8         let number = 1 << i
 9         if number > max {break}
10         set.append(String("\(number)".sorted(by: >)))
11     }
12      return set.contains(stirng)
13     }
14 }
相關文章
相關標籤/搜索