题解 | #第一个只出现一次的字符#

使用的是双指针遍历的方法,先看慢指针前面的字符是否有与它相等的,固定慢指针,移动快指针,如果有,就让慢指针+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;
}
全部评论

相关推荐

06-18 13:28
已编辑
门头沟学院 Web前端
爱睡觉的冰箱哥:《给予你300的工资》,阴的没边了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务