题解 | #第一个只出现一次的字符#
使用的是双指针遍历的方法,先看慢指针前面的字符是否有与它相等的,固定慢指针,移动快指针,如果有,就让慢指针+1,重新遍历,如果没有,就看慢指针后面的内容是否有与它相同的,固定此时的慢指针,重新定义一个指针,让它从头开始遍历,看它走到慢指针前,是否有与慢指针相同的,如果有就让慢指针+1,重新遍历,如果没有,说明这个字符就是我们要找到字符。如果慢指针都遍历完了,也没有找到,说明该字符串没有符合要求的字符,return -1。
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
int FirstNotRepeatingChar(char* str) {
// write code here
//如果开头就是\0,就直接返回-1
if ((*str) == '\0') {
return -1;
}
//如果不是
char* slow = str;
char* fast = str + 1;
//遍历慢指针
while (*slow)
{
//遍历快指针
fast = slow + 1;
while (*fast != '\0' && *slow != *fast) {
fast++;
}
//出循环之后,要么两者相等,要么快指针走完了
//如果两者相等
if (*slow == *fast)
{
//慢指针往后走,并且重新进入循环
slow++;
continue;
}
//如果快指针走完了
//说明慢指针前面没有与它相等的,就看后面有没有和它相等的
char* p = str;
//如果慢指针是头元素,说明后面就没有与它相等的了
if (slow == str)
{
//返回数组下标
return slow - str;
}
//如果不是头元素,就看与后面的是否与它有相等的
while (*p != *slow)
{
p++;
}
//如果是它本身,就说明后面没有与它相等的了
if (p == slow)
{
return slow - str;
}
//如果不是,则就说明后面有与它相等的
//则不是这个下标,,慢指针往后走,并且继续执行大循环
slow++;
continue;
}
//走到这里,说明都不符合
return -1;
}
拼多多集团-PDD公司福利 817人发布