[Swift]LeetCode385. 迷你语法分析器 | Mini Parser

[Swift]LeetCode385. 迷你语法分析器 | Mini Parser,第1张

概述Given a nested list of integers represented as a string, implement a parser to deserialize it. Each element is either an integer, or a list -- whose elements may also be integers or other lists. Note:

Given a nested List of integers represented as a string,implement a parser to deserialize it.

Each element is either an integer,or a List -- whose elements may also be integers or other Lists.

Note: You may assume that the string is well-formed:

String is non-empty. String does not contain white spaces. String contains only digits 0-9[- ,]

Example 1:

Given s = "324",You should return a nestedInteger object which contains a single integer 324. 

Example 2:

Given s = "[123,[456,[789]]]",Return a nestedInteger object containing a nested List with 2 elements:1. An integer containing value 123.2. A nested List containing two elements:    i.  An integer containing value 456.    ii. A nested List with one element:         a. An integer containing value 789.

给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器

列表中的每个元素只可能是整数或整数嵌套列表

提示:你可以假定这些字符串都是格式良好的:

字符串非空 字符串不包含空格 字符串只包含数字0-9] 

示例 1:

给定 s = "324",你应该返回一个 nestedInteger 对象,其中只包含整数值 324。 

示例 2:

给定 s = "[123,返回一个 nestedInteger 对象包含一个有两个元素的嵌套列表:1. 一个 integer 包含值 1232. 一个包含两个元素的嵌套列表:    i.  一个 integer 包含值 456    ii. 一个包含一个元素的嵌套列表         a. 一个 integer 包含值 789
88ms
 1 /** 2  * // This is the interface that allows for creating nested Lists. 3  * // You should not implement it,or speculate about its implementation 4  * class nestedInteger { 5  *     // Return true if this nestedInteger holds a single integer,rather than a nested List. 6  *     public func isInteger() -> Bool 7  * 8  *     // Return the single integer that this nestedInteger holds,if it holds a single integer 9  *     // The result is undefined if this nestedInteger holds a nested List10  *     public func getInteger() -> Int11  *12  *     // Set this nestedInteger to hold a single integer.13  *     public func setInteger(value: Int)14  *15  *     // Set this nestedInteger to hold a nested List and adds a nested integer to it.16  *     public func add(elem: nestedInteger)17  *18  *     // Return the nested List that this nestedInteger holds,if it holds a nested List19  *     // The result is undefined if this nestedInteger holds a single integer20  *     public func getList() -> [nestedInteger]21  * }22  */23 class Solution {24     func deserialize(_ s: String) -> nestedInteger {25     if s[s.startIndex] != "[" {26         let n = Int(s)!27         let nest = nestedInteger()28         nest.setInteger(n)29         return nest30     }31     var stack = [nestedInteger]()32     var num = ""33     for c in s.characters {34         if c == "[" {35             stack.append(nestedInteger())36         } else if c == "]"{37             let last = stack.removeLast()38             if !num.isEmpty {39                 let n = Int(num)!40                 let nest = nestedInteger()41                 nest.setInteger(n)42                 last.add(nest)43                 num = ""44             }45             if stack.isEmpty {46                 return last47             }48             if last.isInteger() {49                 stack[stack.count-1].setInteger(last.getInteger())50             } else {51                 stack[stack.count-1].add(last)52             }53         } else if c == "," {54             if let n = Int(num) {55                 let nest = nestedInteger()56                 nest.setInteger(n)57                 stack[stack.count-1].add(nest)58                 num = ""59             }60         } else {61             num.append(c)62         }63     }64     return nestedInteger()65   }    66 }
100ms
 1 extension String { 2     func digitInt(offset: String.Index) -> Int { 3         return Int(self[offset].unicodeScalars.first!.value - "0".unicodeScalars.first!.value) 4     } 5 } 6  7 fileprivate let one2nine = CharacterSet(charactersIn: "123456789") 8 fileprivate let zero2nine = CharacterSet(charactersIn: "0123456789") 9 10 class Solution {11     12     //ListOrInt:    List | integer13     //List:         [ ListOrInt (,ListOrInt)* ]14     //integer:      -? (1-9)?(0-9)*15     16     private func consumeListOrInt(offset: String.Index,s: String) -> (parsed: nestedInteger,offset: String.Index)? {17         if let consumedList = consumeList(offset: offset,s: s) {18             return consumedList19         }20         if let consumedInt = consumeInt(offset: offset,s: s) {21             return consumedInt22         }23         return nil24     }25     26     private func consumeList(offset: String.Index,offset: String.Index)? {27         guard s[offset] == "[" else {28             return nil29         }30         31         let result = nestedInteger()32         var newOffset = s.index(after: offset)33         if let firstElem = consumeListOrInt(offset: newOffset,s: s) {34             result.add(firstElem.parsed)35             newOffset = firstElem.offset36             while true {37                 guard s[newOffset] == "," else {38                     break39                 }40                 newOffset = s.index(after: newOffset)41                 guard let elem = consumeListOrInt(offset: newOffset,s: s) else {42                     break43                 }44                 newOffset = elem.offset45                 result.add(elem.parsed)46             }47         }48         49         guard s[newOffset] == "]" else {50             return nil;51         }52         return (result,s.index(after: newOffset))53     }54     55     private func consumeInt(offset: String.Index,offset: String.Index)? {56         let result = nestedInteger()57         var integer: Int = 058         var positive = true59         var newOffset = offset60         if s[offset] == "-" {61             positive = false62             newOffset = s.index(after: offset)63         }64         guard newOffset < s.endindex else {65             return nil66         }67         if s[newOffset] == "0" {68             result.setInteger(0)69             return (result,s.index(after: newOffset))70         }71         guard one2nine.contains(s[newOffset].unicodeScalars.first!) else {72             return nil73         }74         integer = s.digitInt(offset: newOffset) * (positive ? 1 : -1)75         newOffset = s.index(after: newOffset)76         while true {77             guard newOffset < s.endindex else {78                 break79             }80             guard zero2nine.contains(s[newOffset].unicodeScalars.first!) else {81                 break82             }83             integer = integer * 10 + s.digitInt(offset: newOffset) * (positive ? 1 : -1)84             newOffset = s.index(after: newOffset)85         }86         result.setInteger(integer)87         return (result,newOffset)88     }89     90     func deserialize(_ s: String) -> nestedInteger {91         guard let (parsed,offset) = consumeListOrInt(offset: s.startIndex,s: s) else {92             fatalError()93         }94         if offset != s.endindex {95             fatalError()96         }97         return parsed98     }99 }

10120ms

 1 class Solution { 2     func deserialize(_ s: String) -> nestedInteger { 3         if s.count == 0 {return nestedInteger()} 4         if s[0] != "[" {return nestedInteger(Int(atoi(s)))} 5         if s.count <= 2 {return nestedInteger()} 6         var res:nestedInteger = nestedInteger() 7         var start:Int = 1 8         var cnt:Int = 0 9         for i in 1..<s.count10         {11             if cnt == 0 && (s[i] == "," || i == s.count - 1)12             {13                 res.add(deserialize(s.subString(start,i - start)))14                 start = i + 115             }16             else if s[i] == "[" {cnt += 1}17             else if s[i] == "]" {cnt -= 1}18         }19         return res20     }21 }22 23 extension String {        24     //subscript函数可以检索数组中的值25     //直接按照索引方式截取指定索引的字符26     subscript (_ i: Int) -> Character {27         //读取字符28         get {return self[index(startIndex,offsetBy: i)]}29     }30     31     // 截取字符串:指定索引和字符数32     // - begin: 开始截取处索引33     // - count: 截取的字符数量34     func subString(_ begin:Int,_ count:Int) -> String {35         let start = self.index(self.startIndex,offsetBy: max(0,begin))36         let end = self.index(self.startIndex,offsetBy:  min(self.count,begin + count))37         return String(self[start..<end]) 38     }39 }
总结

以上是内存溢出为你收集整理的[Swift]LeetCode385. 迷你语法分析器 | Mini Parser全部内容,希望文章能够帮你解决[Swift]LeetCode385. 迷你语法分析器 | Mini Parser所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1020686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存