不要给我五个挑战 - 斯威夫特

时间:2017-10-05 18:48:39

标签: swift

我在codewars.com上真的与这个kata挣扎。我是一个完全的初学者,所以我不想要一个解决方案但是如果某些人能够把我推向正确的方向。

"在这个kata中,您可以获得一个区域的起始编号和结束编号,并且应该返回除了数字为5的数字之外的所有数字的计数。起点和终点都包含在内! 例子: 1,9 - > 1,2,3,4,6,7,8,9 - >结果8
4,17 - > 4,6,7,8,9,10,11,12,13,14,16,17 - >结果12"

所以,我到目前为止尝试了这个,但我不知道是否有办法搜索其中包含5个数字的所有数字。有没有办法像我们一样添加通用字符搜索" *"在线?

func dontGiveMeFive(_ start: Int, _ end: Int) -> Int {
    var rez = 0
    var ints = [String]()

    for i in start...end {
        if ints.contains("5") {
            rez += 1
        }
    }

    return rez
}

注意: 解决例子并不难,但是当你考虑到一些不能被5整除的数字时会出现问题,如51,52,53 ......或425980:)

4 个答案:

答案 0 :(得分:3)

有两种不同的方法可以进行检查 - 使用字符串转换和使用数学。

使用数学的方法使用较少的CPU功率,但使用字符串的方法通常较少输入。

使用数学方法执行这两个步骤,直到检查的数字减少到零:

  • 检查最后一位数是否为5;如果是,返回true
  • 删除最后一位数字

检查Int n的最后一个十进制数字是否为5使用n % 10 == 5表达式。将%除以10后,运算符n会返回余数,这是n的最后一位数字的数值。

要删除最后一位数,请使用n /= 10。因为整数除法会截断任何小数部分。

答案 1 :(得分:1)

其他答案应该可以帮助您自己解决问题。如果你感兴趣的话,这是一个单行的功能方法:

使用字符串:

func dontGiveMeFive(_ start: Int, _ end: Int) -> Int {
    return [Int](start...end).map(String.init).filter{!$0.contains("5")}.count
}

答案 2 :(得分:1)

最简单的方法是将每个数字转换为字符串,并检查字符串是否包含"5"作为子字符串:

extension CountableClosedRange {
    var countOfFivelessElements: Int {
        var count = 0
        for i in self {
            if (!"\(i)".contains("5")) {
                count += 1
            }
        }
        return count
    }
}

(40...60).countOfFivelessElements

答案 3 :(得分:0)

基于数学的解决方案可以如下:

// First create a function that will tell you if a number contains 
// a 5.  (easier to define and implement recursively):
// A number will contain a 5 if its last digit is 5
// or if its ten's (number divided by 10) contains a 5
//
func has5(_ value:Int) -> Bool
{ return value > 0 && (value % 10 == 5 || has5(value / 10)) }

// generate the list of numbers (using a range) and 
// filter out numbers that contain a 5
func exclude5s(from:Int, to:Int) -> [Int]
{ return (from...to).filter{!has5($0)} }

// use the number generation function and count
// elements

exclude5s(from:4, to: 17).count  // --> 12

[编辑]以数学方式看待它的另一种方式是,没有任何5s的数字在其表示中仅使用9位数,实际上是数字为5,6,7和8的不同符号的基数为9的数字(其中将分别显示为6,7,8和9。

所以,如果我们有一对函数在真正的基数9表示和没有5s的“替代”显示形式之间进行转换,我们可以使用标准函数处理范围,前提是我们通过转换函数来执行此操作

例如:

// convert a base9 number to its "no 5s" representation in base 10)
func base9toNo5s(_ value:Int) -> Int
{  return value == 0 ? 0 : base9toNo5s(value/9)*10 + value % 9 + (value % 9 > 4 ? 1 : 0) }

// convert a number in "no 5s" representation to its base 9 equivalent
func no5sToBase9(_ value:Int) -> Int
{ return value == 0 ? 0 : no5sToBase9(value/10)*9 + value % 10 - ( value % 9 > 4 ? 1 : 0) }

// first 100 "no 5s" number
let first100 = (1...100).map{ base9toNo5s($0) }

// "no 5s" numbers in a range
let range = (no5sToBase9(1237)...no5sToBase9(2119)).map{ base9toNo5s($0) }