• [Swift]LeetCode401. 二进制手表 | Binary Watch


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9779604.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).

    Each LED represents a zero or one, with the least significant bit on the right.

    For example, the above binary watch reads "3:25".

    Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.

    Example:

    Input: n = 1
    Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

    Note:

    • The order of output does not matter.
    • The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".
    • The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02".

     二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。

    每个 LED 代表一个 0 或 1,最低位在右侧。

    例如,上面的二进制手表读取 “3:25”。

    给定一个非负整数 代表当前 LED 亮着的数量,返回所有可能的时间。

    案例:

    输入: n = 1
    返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

    注意事项:

    • 输出的顺序没有要求。
    • 小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
    • 分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3         var times:[String] = [String]()   
     4         //轮询遍历
     5         for h in 0..<12
     6         {
     7             //将常量转换为变量
     8             var hour:Int = h
     9             for m in 0..<60
    10             {
    11                 //将常量转换为变量
    12                 var minute:Int = m
    13                 var number:Int = hour*64 + minute
    14                 if number.bitCount() == num
    15                 {
    16                     //minute不足2位前面补0的写法:%02d
    17                     var str = String(format: "%d:%02d", arguments:[hour,minute]) 
    18                     times.append(str)
    19                 }
    20             }           
    21         }
    22         return times
    23     }   
    24 }
    25 //Int扩展代码
    26 extension Int
    27 {
    28     mutating func bitCount() -> Int
    29     {
    30         self = self - ((self >> 1) & 0x55555555);
    31         self = (self & 0x33333333) + ((self >> 2) & 0x33333333);
    32         self = (self + (self >> 4)) & 0x0f0f0f0f;
    33         self = self + (self >> 8);
    34         self = self + (self >> 16);
    35         return self & 0x3f;        
    36     }
    37 }

    8ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3        
     4         let leds = [1, 2, 4, 8, 1, 2, 4, 8, 16, 32]
     5         var result = [String]()
     6         readBinaryWatch(leds, leds.count, 0, (leds.count - num), 0, 0, &result) 
     7         return result
     8     } 
     9     
    10     func readBinaryWatch(_ leds: [Int], _ ledsCount: Int, _ left: Int, _ right: Int, _ hours: Int, _ minutes: Int, _ result: inout [String]) {
    11         if hours > 11 || minutes > 59 { return }
    12         if right >= leds.count {
    13             result.append(String(format: "%d:%02d", hours, minutes)) 
    14             return 
    15         }
    16         
    17         for index in left...right {
    18             var currentHours = hours
    19             var currentMinutes = minutes
    20             
    21             let value = leds[index]
    22             if index >= 4 { currentMinutes += value } 
    23             else { currentHours += value } 
    24             
    25             readBinaryWatch(leds, ledsCount, index + 1, right + 1, currentHours, currentMinutes, &result)  
    26         }
    27     }
    28     
    29 }

    12ms

     1 class Solution {
     2     let hourArray = [
     3         [0],
     4         [1, 2, 4, 8],
     5         [3, 5, 6, 9, 10],
     6         [7, 11]
     7     ]
     8     let minArray = [
     9         [0],
    10         [1, 2, 4, 8, 16, 32],
    11         [3, 5, 6, 9, 10, 12, 17, 18, 20, 24, 33, 34, 36, 40, 48],
    12         [7, 11, 13, 14, 19, 21, 22, 25, 26, 28, 35, 37, 38, 41, 42, 44, 49, 50, 52, 56],
    13         [15, 23, 27, 29, 30, 39, 43, 45, 46, 51, 53, 54, 57, 58],
    14         [31, 47, 55, 59]
    15     ]
    16     func readBinaryWatch(_ num: Int) -> [String] {
    17         var result = [String]()
    18         
    19         for hNum in 0...min(3, num) {
    20             let mNum = num - hNum
    21             if mNum < minArray.count {
    22                 for h in hourArray[hNum] {
    23                     for m in minArray[mNum] {
    24                         result.append("(h):(String(format: "%02d", m))")
    25                     }
    26                 }
    27             }
    28         }
    29         return result
    30     }
    31 }

    20ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3         var times: [String] = []
     4         let maxClock = num == 1 ? 8 : 11
     5         let maxMinute = num == 1 ? 32 : 59
     6         for clock in 0...maxClock {
     7             for minute in 0...maxMinute {
     8                 if bitCount(clock) + bitCount(minute) == num {
     9                     let time = String(format: "%d:%02d", clock, minute)
    10                     times.append(time)
    11                 }
    12             }
    13         }
    14         
    15         return times
    16     }
    17     
    18     func bitCount(_ num: Int) -> Int {
    19         var result = 0
    20         var num2 = num
    21         while num2 > 0 {
    22             result += num2 & 1
    23             num2 >>= 1
    24         }
    25         
    26         return result
    27     }
    28 }

    28ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3         var res = [String]()
     4 
     5         func bitCount(_ num: Int) -> Int {
     6             var count = 0
     7             var num = num
     8             while num > 0 {
     9                 count += num & 1
    10                 num >>= 1
    11             }
    12             return count
    13         }
    14 
    15         for h in 0...11 {
    16             for m in 0...59 {
    17                 if bitCount(h) + bitCount(m) == num {
    18                     res.append(String(format: "%d:%02d", h, m))
    19                 }
    20             }
    21         }
    22 
    23         return res
    24     }
    25 }

    48ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3         var ret: [String] = []
     4         
     5         for i in 0...11 {
     6             for j in 0...59 {
     7                 let hourBinary = String(i, radix: 2).filter { $0 == "1" }
     8                 let minuteBinary = String(j, radix: 2).filter { $0 == "1" }
     9                 
    10                 if hourBinary.count + minuteBinary.count == num {
    11                     ret.append(String(format: "%d:%02d", i, j))
    12                 }
    13             }
    14         }
    15         
    16         return ret
    17     }
    18 }

    48ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3         var res = [String]()
     4 
     5         func findLEDs(_ h: Int, _ m: Int) -> Int {
     6             let hc = Array(String(h, radix: 2)).filter { $0 == "1" }.count
     7             let mc = Array(String(m, radix: 2)).filter { $0 == "1" }.count
     8             return hc + mc
     9         }
    10 
    11         for h in 0...11 {
    12             for m in 0...59 {
    13                 if findLEDs(h, m) == num {
    14                     res.append(String(format: "%d:%02d", h, m))
    15                 }
    16             }
    17         }
    18 
    19         return res
    20     }
    21 }

    52ms

     1 class Solution {
     2     func readBinaryWatch(_ num: Int) -> [String] {
     3     var result = [String]()
     4     
     5     func findLEDs(_ h: Int, _ m: Int) -> Int {
     6         let hc = Array(String(h, radix: 2).characters).filter { $0 == "1" }.count
     7         let mc = Array(String(m, radix: 2).characters).filter { $0 == "1" }.count
     8         return hc + mc
     9     }
    10     for h in 0...11 {
    11         for m in 0...59 {
    12             if findLEDs(h, m) == num {
    13                 result.append(String(format: "%d:%02d", h, m))
    14             }
    15         }
    16     }
    17     return result
    18     }
    19 }
  • 相关阅读:
    使用脚本进入一个命令行控制台,并预设执行的命令列表
    cifs挂载远程文件出现 No such device or address错误
    longtable 跨越多个页面时,如何在跨页时自动断行并加上横线及去掉页眉
    matplotlib中文显示-微软雅黑
    latex编译过程-关于嵌入所有字体
    python做图笔记
    linux启动全过程
    连接并同步windows下的git仓库
    反向ssh
    Ubuntu更改启动内存
  • 原文地址:https://www.cnblogs.com/strengthen/p/9779604.html
Copyright © 2020-2023  润新知