《剑指Offer》:移除字符串中重复的字符

题目:

移除字符串中重复的字符,

如abcadc移除后变为abcd,

注意:可以额外定义一两个变量,但不允许额外开辟一个数组。

思路

这里要求了空间复杂度为O(1),那我们只能用最简单的遍历方法,先让第一个字符与后面的字符一一比较,遇到重复的就把重复的字符用’\0’替换掉,再让第二个字符与右面的字符一一比较,遇到重复的,就把重复的字符用’\0’代替,如此循环,直到最后一个字符,当然同时还要在每次遇到’\0’时(重复字符出现的位置,已被填充为’\0’),将后面的字符移到前面来,替换掉’\0’,最后将移位后的最后一个位置设为’\0’,标志该字符串的结束。时间复杂度为O(n*n)。

实现代码如下:

/*
移除字符串中重复的字符,
如abcadc移除后变为abcd,
可以额外定义一两个变量,但不允许额外开辟一个数组。
*/

#include<stdio.h>
#include<string.h>

void deleteDuplicateCharInStr(char *str){
    int len=strlen(str);
    if(len<2){//长度小于 2,说明,字符串至多只有一个字符,因此一定没有重复字符
        return;
    }
    int p=0;//用来跟踪 i,
    for(int i=0;i<len;i++){
        if(str[i]!=‘\0‘){
            //如果当前字符不为‘\0‘时,p一直与i相等,
            //如果当前字符为‘\0‘,则p会小于i,从而用后面的字符来填充前面‘\0‘字符的位置
            str[p++]=str[i];
            for(int j=i+1;j<len;j++){
                if(str[j]==str[i]){//将后面重复的字符全部 ‘\0‘替换
                    str[j]=‘\0‘;
                }
            }
        }
    }
    str[p]=‘\0‘;//当循环结束后,为字符串的后面补上 ‘\0‘,即保证字符串是以‘\0‘结尾 

}

int main(void){
    char str[1000];
    gets(str);
    deleteDuplicateCharInStr(str);
    puts(str);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 22:38:27

《剑指Offer》:移除字符串中重复的字符的相关文章

《剑指Offer》:移除字符串中重复的字符_2

题目 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为abcd, 要求:时间复杂度尽可能小 与上篇博文(http://blog.csdn.net/u010412719/article/details/48086641)不一样的地方是:虽然都是移除字符串中重读的字符,但是这里的要求是时间复杂度尽可能小,对空间没有要求. 思路 思路:要求时间复杂度尽可能小而对空间没有限制,这就需要我们用控件换取时间 /* 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为a

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

剑指offer:删除链表中重复的节点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

剑指offer:删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

剑指offer——20删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题解: 这道题没什么讲的,注意指向空的边界就行,新建一个头节点更容易处理. 1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) { 4 if (pHead == nullptr

【剑指Offer】03. 数组中重复的数字

题目链接 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 解法一:最简单的,排序后找重复的 class Solution { public int findRepeatNumber(int[] nums) {

剑指offer系列24---数组中重复的数字

* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 书上方法: 1 package com.exe6.offer; 2 /** 3 * [24] 4 * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. 5 * 数组中某些