C++笔试: 最优算法实现 给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。

最优算法实现C++笔试:给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。

要实现最优算法来去除连续重复的字符,可以使用双指针的方法进行原地修改,而不使用额外的字符串存储结果。具体逻辑如下:

1、初始化两个指针:一个指向原始字符串的第一个字符(称为current),一个指向当前处理后的字符串的最后一个字符(称为result)。

2、从第二个字符开始遍历原始字符串,比较当前字符和前一个字符是否相同:
**·**如果相同,则继续遍历下一个字符。
**·**如果不相同,则将当前字符放到处理后的字符串中,并将result指针向后移动一位。
在处理完所有字符后,将处理后的字符串的结尾标记为字符串结束符。

3、返回处理后的字符串。

以下是对应的 C++ 代码实现:

#include 

void removeDuplicates(std::string& str) {
    if (str.empty()) {
        return;
    }

    int resultIndex = 0;
    for (int i = 1; i < str.length(); i++) {
        if (str[i] != str[resultIndex]) {
            resultIndex++;
            str[resultIndex] = str[i];
        }
    }

    str.erase(resultIndex + 1);
}

int main() {
    std::string str = "aabbbcdde";
    std::cout << "Original string: " << str << std::endl;
    removeDuplicates(str);
    std::cout << "Processed string: " << str << std::endl;

    return 0;
}

运行上述代码,输出结果为:

Original string: aabbbcdde
Processed string: abcde

以上代码直接在原始字符串上进行修改,使用一个指针resultIndex指示当前处理的位置。在遍历原始字符串时,通过比较当前字符和resultIndex指向的字符是否相同来判断是否需要更新resultIndex指向的位置,并将当前字符放到相应位置。最后,通过调用erase()函数删除多余的字符。这种算法只需遍历一次字符串,时间复杂度为O(n),是一种高效的实现方式。

你可能感兴趣的:(C++面试宝典,c++,算法)