[Swift]LeetCode880. 索引处的解码字符串 | Decoded String at Index

An encoded string S is given.  To find and write the decodedstring to a tape, the encoded string is read one character at a time and the following steps are taken:

  • If the character read is a letter, that letter is written onto the tape.
  • If the character read is a digit (say d), the entire current tape is repeatedly written d-1 more times in total.

Now for some encoded string S, and an index K, find and return the K-th letter (1 indexed) in the decoded string.

Example 1:

Input: S = "leet2code3", K = 10
Output: "o"
Explanation:
The decoded string is "leetleetcodeleetleetcodeleetleetcode".
The 10th letter in the string is "o".

Example 2:

Input: S = "ha22", K = 5
Output: "h"
Explanation:
The decoded string is "hahahaha".  The 5th letter is "h".

Example 3:

Input: S = "a2345678999999999999999", K = 1
Output: "a"
Explanation:
The decoded string is "a" repeated 8301530446056247680 times.  The 1st letter is "a".

Note:

  1. 2 <= S.length <= 100
  2. S will only contain lowercase letters and digits 2through 9.
  3. S starts with a letter.
  4. 1 <= K <= 10^9
  5. The decoded string is guaranteed to have less than 2^63 letters.


给定一个编码字符串 S。为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤:

  • 如果所读的字符是字母,则将该字母写在磁带上。
  • 如果所读的字符是数字(例如 d),则整个当前磁带总共会被重复写 d-1 次。

现在,对于给定的编码字符串 S 和索引 K,查找并返回解码字符串中的第 K 个字母。

示例 1:

输入:S = "leet2code3", K = 10
输出:"o"
解释:
解码后的字符串为 "leetleetcodeleetleetcodeleetleetcode"。
字符串中的第 10 个字母是 "o"。

示例 2:

输入:S = "ha22", K = 5
输出:"h"
解释:
解码后的字符串为 "hahahaha"。第 5 个字母是 "h"。

示例 3:

输入:S = "a2345678999999999999999", K = 1
输出:"a"
解释:
解码后的字符串为 "a" 重复 8301530446056247680 次。第 1 个字母是 "a"。 

提示:

  1. 2 <= S.length <= 100
  2. S 只包含小写字母与数字 2 到 9 。
  3. S 以字母开头。
  4. 1 <= K <= 10^9
  5. 解码后的字符串保证少于 2^63 个字母。


Runtime: 4 ms

Memory Usage: 19.6 MB

 1 class Solution {
 2     func decodeAtIndex(_ S: String, _ K: Int) -> String {
 3         var K = K
 4         var N:Int = 0
 5         var arrS:[Character] = Array(S)
 6         var countS:Int = S.count < K ? S.count : K
 7         for i in 0..<countS
 8         {
 9             let num:Int = arrS[i].ascii
10             N = num >= 48 && num <= 57 ? N * (num - 48) : N + 1
11         }
12         var i = countS - 1
13         while (true)
14         {
15             let num:Int = arrS[i].ascii
16             if num >= 48 && num <= 57
17             {
18                 N /= num - 48
19                 K %= N
20             }
21             else if K % N == 0
22             {
23                 return String(arrS[i])
24             }
25             else
26             {
27                 N -= 1
28             }
29             i -= 1
30         }
31         return String()
32     }
33 }
34
35 //Character扩展
36 extension Character
37 {
38   //Character转ASCII整数值(定义小写为整数值)
39    var ascii: Int {
40        get {
41            return Int(self.unicodeScalars.first?.value ?? 0)
42        }
43     }
44 }


4ms

 1 class Solution {
 2     func decodeAtIndex(_ S: String, _ K: Int) -> String {
 3         var stack: [Character] = []
 4
 5         var charCount: Int = 0
 6         var movingIndex: Int = 0
 7         var S = Array(S)
 8
 9         while movingIndex < S.count && charCount < K {
10             let character = S[movingIndex]
11             if character.isDigit() {
12                 charCount *= character.toDigit()
13             } else {
14                 charCount += 1
15             }
16             movingIndex += 1
17         }
18         var k = K
19         while movingIndex > 0 {
20             movingIndex -= 1
21             let character = S[movingIndex]
22             if character.isDigit() {
23                 charCount /= character.toDigit()
24                 k %= charCount
25             } else {
26                 if k == 0 || k == charCount {
27                     return String(character)
28                 }
29                 charCount -= 1
30             }
31         }
32
33         return ""
34     }
35 }
36
37 extension Character {
38     func isDigit() -> Bool {
39         return Int(String(self)) != nil
40     }
41
42     func toDigit() -> Int {
43         return Int(String(self))!
44     }
45 }


12ms

 1 class Solution {
 2     let digiSets = Set<Character>("123456789")
 3     func decodeAtIndex(_ S: String, _ K: Int) -> String {
 4         if K == 0 {
 5             if !digiSets.contains(S.last!) { return String(S.last!) }
 6             return decodeAtIndex(String(S.dropLast()), K)
 7         }
 8
 9         var lastStr = [Character]()
10         var lastCount = 0, curCount = 0
11         var chars = Array(S)
12         for i in chars.indices {
13             if digiSets.contains(chars[i]) {
14                 curCount *= Int(String(chars[i]))!
15                 if curCount >= K { return decodeAtIndex(String(lastStr), K % lastCount)}
16             }
17             else {
18                 curCount += 1
19                 if curCount == K  { return String(chars[i]) }
20             }
21             lastStr.append(chars[i])
22             lastCount = curCount
23         }
24         return ""
25     }
26 }


20ms

 1 class Solution {
 2     func decodeAtIndex(_ S: String, _ K: Int) -> String {
 3         func isNum(_ char: Character) -> Bool {
 4             if char == "2" || char == "3" || char == "4" || char == "5" || char == "6" || char == "7" || char == "8" || char == "9" {
 5                 return true
 6             }
 7             return false
 8         }
 9         var size = 0, k = K
10         for char in S {
11             if isNum(char) {
12                 let str = String(char)
13                 size *= (Int(str) ?? 1-1)
14             } else {
15                 size += 1
16             }
17         }
18         for item in S.reversed() {
19             k %= size
20             if k == 0  && !isNum(item) {
21                 return String(item)
22             }
23             if isNum(item) {
24                 let str = String(item)
25                 size /= (Int(str) ?? 1)
26             } else {
27                 size -= 1
28             }
29         }
30         return ""
31     }
32 }

原文地址:https://www.cnblogs.com/strengthen/p/10602684.html

时间: 2024-10-31 06:02:14

[Swift]LeetCode880. 索引处的解码字符串 | Decoded String at Index的相关文章

Leetcode(884)-索引处的解码字符串

给定一个编码字符串 S.为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: 如果所读的字符是字母,则将该字母写在磁带上. 如果所读的字符是数字(例如 d),则整个当前磁带总共会被重复写 d-1 次. 现在,对于给定的编码字符串 S 和索引 K,查找并返回解码字符串中的第 K 个字母. 示例 1: 输入:S = "leet2code3", K = 10 输出:"o" 解释: 解码后的字符串为 "leetleetcodeleet

【Swift学习】Swift编程之旅---字符与字符串(五)

String是swift的字符串类型.一个字符串是一个有效的字符序列,因此还可以使字符集合表示.通过+符号可以连接字符串. String 类型是一种快速.现代化的字符串实现.每一个字符串都是由独立编码的 Unicode 字符组成,并提供了用于访问这些字符在不同Unicode表示的支持.使用""来标示字符串. 一.初始化空字符串 var emptyString = "" var anotherEmptyString = String() 这2种初始化方法是等价的. i

Swift学习笔记-教程学习二字符串和字符(Strings and Characters)

按照swift教程的内容,把自己觉得重要的记录了下来.——新波 2.1字符串字面量String Literals 字符串字面量是由双引号 ( "" ) 包裹着的具有固定顺序的文本字符集. let someString = "Some string literal value" 2.2初始化空字符串 Initializing an Empty String var emptyString = ""               // 空字符串字面量

swift学习第五天:字符串

字符串的介绍 字符串在任何的开发中使用都是非常频繁的 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"",Swift中字符串"" 使用 String 的原因 String 是一个结构体,性能更高 NSString 是一个 OC 对象,性能略差 String 支持直接遍历 Swift 提供了 String 和 NSString 之间的无缝转换 字符串的使用 遍历字符串 // 字符串遍历 va

Swift的基础,操作符,字符串和集合类型

这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" "/**/", 注意这里"/**/"在Swift可以嵌套使用 表达式结尾不再有分号 整数 你可以声明为Int或者UInt,他们本身适应不同平台(64位, 32位),类似于NSInteger,NSUInteger 也可以直接声明为指定字节数的Int,如: Int8, In

Swift之字符串(String)

学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSString还是区别不小的,Swift中的String又回归了正常状态,使用起来更为方便快捷.本篇博客的主题就是Swift中的字符串类型String,String在Swift中让人省心了不少.今天这篇博客就好好的认识一下Swift中的String. 一.字符串拷贝 在Swift中的字符串拷贝直接可以使用=号来操作,这个等号不是指针之间的赋值这么简单.如果将字符串A的值赋给字符串B,那么A和B的的内存地

如何在JS数组特定索引处指定位置插入元素?

需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one", "two", "four"];// splice(position, numberOfItemsToRemove, item)// 拼接函数(索引位置, 要删除元素的数量, 元素)array.splice(2, 0, "three"); // www.jbxue.comarray;

Swift - 1 (常量、变量、字符串、数组、字典、元组、循环、枚举、函数)

Swift 中导入类库使用import,不再使用<>,导入自定义不再使用"" import Foundation 1> 声明变量和常量 在Swift中使用 "let" 修饰一个常量,使用 "var" 修饰一个变量; let修饰常量的值是不可以更改的: var修饰的变量的值是可以更改的: 在声明常量和变量的时候可以使用表情符号.中文等命名常量名和变量名. Swift定义变量或者常量的时候,需要标识出变量或者常量的类型,如果不标识,

JAVA编码字符串和解码字符串

1.编码字符串 public static String encode(String s, String encodeType) { if (s == null || s.equals("")) { return ""; } if (encodeType == null || encodeType.equals("")) { return s; } try { return URLEncoder.encode(s, encodeType); }