Swift 5如何按条件替换字符串字符实现数字转伪二进制
Swift 5 实现数字字符串伪二进制转换
问题要求
给定非空数字组成的字符串,按如下规则转换后返回新字符串:
- 数值小于5的数字字符替换为
"0" - 数值大于等于5的数字字符替换为
"1"
你之前用Python写的遍历逐字符判断逻辑完全可行,Swift中String的索引逻辑和Python差异较大,直接套用Python的下标写法很容易报错。
关于String.replacingOccurrences(of:with:)的实现方案
这个方法的作用是全局替换字符串中固定匹配的内容,本身不支持条件判断逻辑,但你可以通过链式调用,逐个匹配0-9的数字完成替换,完全可以实现需求,代码如下:
func fakeBin(digits: String) -> String { var result = digits // 替换所有小于5的数字为0 result = result.replacingOccurrences(of: "1", with: "0") result = result.replacingOccurrences(of: "2", with: "0") result = result.replacingOccurrences(of: "3", with: "0") result = result.replacingOccurrences(of: "4", with: "0") // 替换所有大于等于5的数字为1 result = result.replacingOccurrences(of: "5", with: "1") result = result.replacingOccurrences(of: "6", with: "1") result = result.replacingOccurrences(of: "7", with: "1") result = result.replacingOccurrences(of: "8", with: "1") result = result.replacingOccurrences(of: "9", with: "1") return result }
这种写法虽然能跑,但非常冗余,属于为了用这个方法而用,实际开发不推荐,下面是更符合Swift语法习惯的实现方式。
其他更优实现方式
1. 逐字符遍历拼接(和Python逻辑最贴近)
和你写Python的思路完全一致,初始化一个空字符串存结果,遍历原字符串每个字符,判断数值后拼接对应字符即可。注意Swift中Character转Int得到的是可选值,题目明确输入是纯数字,直接强解不会出错:
func fakeBin(digits: String) -> String { var res = "" for c in digits { res.append(Int(String(c))! < 5 ? "0" : "1") } return res }
你之前写的代码框架有两个明显问题:
- 把
return digits写在了for循环内部,第一次遍历就会返回,不会处理完所有字符 - Swift的String是值类型,遍历得到的字符是临时拷贝,直接在循环里修改遍历值不会影响原字符串,所以需要新建变量存储结果。
2. 高阶函数简洁实现
Swift中String的map方法可以直接遍历每个字符,转换后直接构造新字符串,代码非常精简:
func fakeBin(digits: String) -> String { String(digits.map { Int(String($0))! < 5 ? "0" : "1" }) }
3. ASCII值判断(性能最优)
数字字符的ASCII值是连续的,"0"的ASCII值为48,"5"的ASCII值为53,直接判断ASCII值可以省去类型转换的开销:
func fakeBin(digits: String) -> String { var res = "" for c in digits { res.append(c.asciiValue! < 53 ? "0" : "1") } return res }
内容的提问来源于stack exchange,提问作者bridgecoder
相关产品推荐
相关产品推荐

