今天在网上无意中看到一篇关于面试题的
题目要求:
找出字符串中,第一个不重复的字符,若是不存在则返回”-“
例: 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时,则完全不必要再遍例一次字符串;