判断字符串中的字符是否具有唯一性

问题:如何判断输入的字符串儿中的每个字符是否都具有唯一性?

  我们先来随便定义一个可以输入字符串儿的函数,然后再调用这个函数,看看返回的结果是否和我们预期的结果一致:

func challenge(input: String) -> Bool {
    
    return true
}

challenge(input: "No duplicates") // 应该返回true
challenge(input: "abcdefghijklmnopqrstuvwkyz") // 应该返回true
challenge(input: "AaBbCc") // 应该返回true
challenge(input: "Hello, world") // 应该返回false

  很显然,在第4次调用challenge(input: )函数的时候,我们输入了字符串儿“Hello,world”,它显然不符合我们题目的要求,因为该字符串儿中包含了3个l字符,以及两个o字符,最终理应返回false,但是程序运行的结果是返回了true:

判断字符串儿中的字符是否唯一.png

  所以,我们需要对上面的代码进行相应的改造。具体的思路是:先定义一个可变的Character类型的数组,专门用来存放我们输入的字符,然后遍历输入的所有字符,并且判断该字符是否已经存在于Character类型的数组中,如果存在,则直接返回false,如果不存在,则将该字符存储到Character类型的数组中。用代码表示如下:

func challenge1(input: String) -> Bool {
    
    // 定义一个用来存储字符的数组
    var usedLetters = [Character]()
    
    // 遍历输入的字符串儿
    for letter in input.characters {
        
        // 判断数组usedLetters中是否已经包含该字符
        if usedLetters.contains(letter) {
            
            // 如果包含,则直接返回
            return false
        }
        
        // 如果不包含,则将该字符存储到数组usedLetters中
        usedLetters.append(letter)
    }
    
    return true
}


challenge1(input: "No duplicates") // 应该返回true
challenge1(input: "abcdefghijklmnopqrstuvwkyz") // 应该返回true
challenge1(input: "AaBbCc") // 应该返回true
challenge1(input: "Hello, world") // 应该返回false

  调用challenge1(input: )函数,重新输入上面的字符串,这回我们可以看到输入“Hello,world”以后,结果返回false了:

判断字符串儿中的字符是否唯一.png

  很多时候,解决问题的方案不止一种。我们可以利用Set集合中的元素不能重复这一特性来简化上面的代码:

func challenge1b(input: String) -> Bool {
    
    return Set(input.characters).count == input.characters.count
}

challenge1b(input: "No duplicates") // 应该返回true
challenge1b(input: "abcdfghijklmnopqrstuvwxyz") // 应该返回true
challenge1b(input: "AaBbCc") // 应该返回true
challenge1b(input: "Hello, world") // 应该返回false

  因为在Set集合中,重复的元素只能算作一次,所以如果我们输入的字符串儿中包含重复的字符,那么最后两边的个数肯定是不相等的,也就是会返回false:

判断字符串儿中的字符是否唯一.png

  利用Set的特性精简代码以后,效果是一样的,但是效率更高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,221评论 0 13
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,169评论 0 7
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,500评论 0 5
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 2,045评论 1 24
  • 回看的话:无论喜怒哀乐,人生总要继续!是继续坚持,还是继续幻想?以下内容写于2010年2月13日-16日。 大年三...
    小丢丢弟弟阅读 349评论 0 6