Swift,for循环索引值不会像预期的那样改变

时间:2016-06-06 21:22:26

标签: arrays swift2

  

这是我的代码,在我的for循环中,有一个while循环更改   变量i的值。我在while循环之前打印出i的值   和循环之后,新的"之前的索引值"预计将开始   at"在索引值+ 1"之后。然而,"新的指数值"只是   正常增加,每次增加一个。感谢你的时间。

class Solution
{
    func summaryRange(nums: [Int]) -> [String]
    {
        var result = [String]()

        if nums.count == 1
        {
            result.append(String(nums[0])+"")
            return result
        }

        for var i in (0...nums.count-1)
        {
            let a = nums[i]
            print("before: \(i)")

            while i+1<nums.count && (nums[i+1] - nums[i] == 1)
            {
                i += 1
            }

            if a != nums[i]
            {
                result.append(String(a) + "->" + String(nums[i]))
            }
            else
            {
                result.append(String(a)+"")
            }

            print("after: \(i)")

        }


        return result
    }
}



var test = Solution()
var input = [0,1,2,4,5,7]
var result = test.summaryRange(input)
print(result)
  

此代码尝试获得类似[&#34; 0-&gt; 2&#34;,&#34; 4-&gt; 5&#34;,&#34; 7&#34;]

的结果

3 个答案:

答案 0 :(得分:1)

这是一个有趣的。我认为这样做的伎俩(还有一些代码清理: - ]

class Solution
{
  func summaryRange(nums: [Int]) -> [String] {
    var result = [String]()
    var currentRange = [Int]()

    for num in nums {
      if currentRange.isEmpty {                           //if range is empty, start a new range
        currentRange.append(num)
        continue
      }
      if num - 1 != currentRange.last! {                  //if not next number in sequence, close range, start new
        result.append(closeRange(currentRange))
        currentRange = []
        currentRange.append(num)
      } else if num - 1 == currentRange.last {
        currentRange.append(num)                          //if next number, add to range
      }
    }
    if !currentRange.isEmpty {
      result.append(closeRange(currentRange))            //check for unclosed ranges
    }
    return result
  }

  func closeRange(range: [Int]) -> String {
    guard range.count > 0 else { return "" }
    if range.count == 1 { return String(range.first!) }
    return "\(range.first!)->\(range.last!)"
  }
}

var test = Solution()
var input = [0,1,2,4,5,7]
var result = test.summaryRange(input)
print(result)

让我知道这对你有用!

答案 1 :(得分:1)

在swift中,for in循环是序列类型的包装器。在这种特殊情况下,0...numCount-1是一个Ints序列。当你在此召唤时,内部会发生什么。

    let a = 0..<5
    var generator = a.generate()
    while var i = generator.next() {
        print(i + 1)
        i+= 1
    }

因此即使你在循环内增加i的值,它也不会影响循环本身。这是因为循环只能通过调用genertator.next()来控制。

这有助于理解基础知识。

答案 2 :(得分:0)

  

这是我自己的解决方案。我弄清楚了问题。基本上,我切换   “for循环”到“while循环”。然后,它有效。

class Solution
{
    func summaryRanges(nums: [Int]) -> [String]
    {
        var result = [String]()

        var i = 0
        while(i<nums.count)
        {
            let a = nums[i]

            while i+1<nums.count && (nums[i+1] - nums[i] == 1)
            {
                i += 1
            }

            if a != nums[i]
            {
                result.append(String(a) + "->" + String(nums[i]))
            }
            else
            {
                result.append(String(a)+"")
            }
            i += 1


        }


        return result
    }
}