字符串剔除不相邻的重复字符

原创 2015年11月20日 21:25:12
 最近因为要忙着找工作,好久没来写博客了。个人想把博客写的有营养一些,但有些力不从心,小生目前技术还没到位,所以,博客也就成了我的笔记本,写一些关于代码的心得。
 废话不多说,进入主题。
 今天,在看iOS相关的面试题,看到一道有点意思的小算法题。刚开始觉得这种简单问题,不值得一做,后来自己闲着没事就试着写了一段,结果,令我大跌眼镜。
 题目如下:
 假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
 首先,我讲述我一开始,看到这种题目思路吧!
 既然我们要去除字符串中重复的字符,我们首先要做的是:确定那些是字符是重复的(删除的字符的数量必须是两个以上的)。然后,我们再判断这些重复字符在字符串中的位置是否是相邻的。显然,这样做下来,是可以把问题解决的!
 思维障碍:一开始看这道题,想的特别多,万一字符串是aabcacd我先删除cc中间的a,然后cc相邻,那么cc不需要删。但是注意的是题目的本意并不是需要我们一步一步的去进行删除,并没有先后顺序,还是一开始字符串确定,我那些所谓分布的步骤是同时进行。
 先上代码再说:
    NSString *originStr = @"aabcacd";

    int i=0, j=0, count, flag=0;
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    for (i=0; i<originStr.length; i++)
    {
        count = 0;
        for (j=0; j<i; j++)
        {
            flag = 0;
            if ([originStr characterAtIndex:i] ==  [originStr characterAtIndex:j])
            {
                flag = 1;
                break;
            }
        }
        if (flag == 1)
            continue;
        for (j=i; j<originStr.length;j++)
        {
            if ([originStr characterAtIndex:i] ==  [originStr characterAtIndex:j])
            {
                count++;
            }
        }
        printf("%c字符的个数:%d\n",[originStr characterAtIndex:i],count);
        NSString *countStr = [NSString stringWithFormat:@"%d",count];
        NSString *characterStr = [NSString stringWithFormat:@"%c",[originStr characterAtIndex:i]];
        [dict setValue:countStr forKey:characterStr];
    }

上面的一段代码实现了查找字符串中所有的字符以及每个字符的个数。
运行结果如下
下面我们要将个数不为1的字符单独抽离出来

    NSMutableDictionary *newDict = [NSMutableDictionary dictionary];
    for (NSString *key in dict) {
        if ([dict[key] intValue] != 1) {
            [newDict setValue:dict[key] forKey:key];
        }
    }

重复出现的字符

在接下来,确定这些字符在字符串中位置:

  NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];

    for (NSString *key in newDict) {
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i<originStr.length; i++) {
            if ([[NSString stringWithFormat:@"%c",[originStr characterAtIndex:i]] isEqualToString:key] ) {
                [array addObject:[NSString stringWithFormat:@"%d",i]];
                [resultDict setValue:array forKey:key];

            }
        }



    }

重复字符的在字符串中的位置

接来下,我们需要判断相邻的位置是否相同的字符

        for (NSString *key in resultDict) {
                NSMutableArray *array = resultDict[key];
                for (int i = 0; i <array.count-1; i++) {
                    if ([array[i] intValue]+1 != [array[i+1] intValue]) {
                        NSUInteger number = (NSUInteger)[array[i+1] integerValue];
                        NSLog(@"number %lu",(unsigned long)number);
                        NSRange range = NSMakeRange(number, 1);
                        originStr = [originStr stringByReplacingCharactersInRange:range  withString:@" "];
                    }
                }

        }

   originStr = [originStr stringByReplacingOccurrencesOfString:@" " withString:@""];

提示:这里面存在一定的问题我们先将重复的字符串先替换成了(空格),然后将空格又装化成“”(空),如果题设中的字符串中间存在空格,那么这样的写法必然是存在问题的。那么会有同学问,为什么不直接替换成(空),首先你要删除的字符万一出现在字符串的最后一个位置,你置为空,那么程序是出错的。
运行的最终结果:aabcd.

另一种解法:

    NSString *originStr = @"aabcacd";
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < originStr.length; i++) {
        [array addObject:[originStr substringWithRange:NSMakeRange(i, 1)]];
    }


    for (int j = 0; j < array.count -1; j++) {
        NSLog(@"%lu",(unsigned long)array.count);
        for (int i = j; i <array.count - 3; i++) {
            if ([[array objectAtIndex:j] isEqualToString:[array objectAtIndex:i+2]]) {
                                [array replaceObjectAtIndex:i+2 withObject:@" "];
            }
        }
    }

代码运行最终的结果

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

相关文章推荐

给定一个字符串,去除整个字符串中重复的字符

该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论:1、不许使用额外的存储空间;2、可使用额外的存储空间 s表示待处理的字符串,l表示当前非重复字符的个数 1、不许使用额...

去除字符串中重复字符

字符串去重

ios 开发中获取字符串中重复的字符的rang

ios 开发中获取字符串中重复的字符的rang

关于iOS去除数组中重复数据的几种方法

在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方法 代码:    NSArray *dat...
  • wm9028
  • wm9028
  • 2015年11月19日 14:29
  • 15850

iOS 数组的去重(普通的无序的去重和排序好的去重)

有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型。今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下。 1.利用NSDictionary...

假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd

NSMutableString * str1 = [[NSMutableString alloc] initWithFormat:@"aabcad"]; for (int i = 0; i <...

前端面试宝典(内容很多,也有很多重复)

二、JS基础 1、javascript的typeof返回哪些数据类型 Object number function boolean underfind 2、例举3种强制类型转换和2种隐式类型转换...

删除字符串中相邻三个或以上重复的字符

前几天2016年9月9日,参加了阿里2016年的笔试编程题,由于自己现在的编程能力还很薄弱,所以投的岗位是测试工程师,现在把那天做的一道编程题写下来,希望自己在以后的编程能力可以慢慢得到提高,哈哈。 ...

删除字符串中相邻三个或以上重复的字符

对于输入的字符串,我们需要完成的任务是从左到右扫描字符串, 如果存在由三个以上(包括三个)连续相同字符组成的字串,就将这个子串从原串中去掉,并将原串剩下的部分拼接到一起。重复上述过程,直到无法去掉任何...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串剔除不相邻的重复字符
举报原因:
原因补充:

(最多只允许输入30个字)