题解 | #第一个只出现一次的字符#
使用的是双指针遍历的方法,先看慢指针前面的字符是否有与它相等的,固定慢指针,移动快指针,如果有,就让慢指针+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; }