查找字符串中首个不重复出现的字符

今天在网上无意中看到一篇关于面试题的

题目要求:
找出字符串中,第一个不重复的字符,若是不存在则返回”-“

例: abcd12ab -> c

分析该题目,它的实现如果使用语言的高级API,很容易实现,而这道题的真实目的,应该是希望面试者使用基本的元数据类型实现它;

下面是自己的实现(kotlin)

fun getNonrepeatChar(s: String): Char {
    val str = s.replace(" ", "")//首先移除所有空格
    var cur: Char
    /**
     * 1. 保存遍例原始字符串时出现的新字符;
     * 2. 若是重复出现的字符,则会被重置为' ';
     * 3. 最终只保留出现一次的字符;
     */
    var cont = CharArray(str.length)
    var last = 0
    var idx = -1
    for (i in str.indices) {
        cur = str[i]
        for (j in 0..i) {
            // 找出重复字符的下标
            if (cur == cont[j]) {
                idx = j
                break
            }
        }

        if (idx == -1) {
            // -1 表示这是一个新的字符
            cont[last] = cur
            last++
        } else {
            // 清除这个重复的元素
            cont[idx] = ' '//重置为空白,方便最后去空
            // reset this index
            idx = -1
        }
    }
    return String(cont).trim().first()
}

这种写法逻辑更加清晰一些

fun getNonrepeat(str: String): Char {
    var str = str.replace(" ", "")
    var cur: Char
    var isRepeat = false
    var repeatIndex = -1
    for (i in str.indices) {
        cur = str[i]

        if (i == repeatIndex) continue
        for (j in str.indices) {
            if (j != i && cur == str[j]) {
                isRepeat = true
                break//相等说明它是重复的元素,进行下一次外循环
            }
        }

        // 遍例一圈后如果没找到重复的,则返回该字符
        if (!isRepeat) {
            return cur
        }
        isRepeat = false
    }
    return '-'
}

第二个写法会有个问题 如字符串:123abac123
i=3时,则可判断出a是重复字符;当i=5时,则完全不必要再遍例一次字符串;

猜你喜欢

转载自blog.csdn.net/s394500839/article/details/81013047
今日推荐