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

原创 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:@" "];
            }
        }
    }

代码运行最终的结果

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

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

对于输入的字符串,我们需要完成的任务是从左到右扫描字符串, 如果存在由三个以上(包括三个)连续相同字符组成的字串,就将这个子串从原串中去掉,并将原串剩下的部分拼接到一起。重复上述过程,直到无法去掉任何...
  • feiweisww
  • feiweisww
  • 2016年09月11日 21:09
  • 1220

用C语言实现一个字符串中删除另外一个字符串

huhhhhhahahahhahhhh #include #include void *del_string( char *p, char *q) { int  i, j; int le...
  • jqaimeng
  • jqaimeng
  • 2015年10月11日 16:54
  • 345

华为:输入一个字符串,删除重复前面的字符,其余字符按原样顺序输出

/* * 输入一个字符串,删除重复前面的字符,其余字符按原样顺序输出. * 例如: * 输入:input: "acbdfdffZZet"; * 输出:output:"acbdfZet"; * 实现函数...
  • shihui512
  • shihui512
  • 2013年04月16日 20:37
  • 1958

实现给定一个字符串剔除重复字符,并统计各个字符出现的次数

import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; publi...
  • m0_37905429
  • m0_37905429
  • 2017年09月10日 20:11
  • 181

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

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

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

NSMutableString * str1 = [[NSMutableString alloc] initWithFormat:@"aabcad"]; for (int i = 0; i <...
  • iOS_MingXing
  • iOS_MingXing
  • 2015年11月09日 21:32
  • 1555

ionic3学习笔记(三)

ionic3实现左右滑动菜单 这里使用了swiper来实现滑动效果: swiper查看:http://www.swiper.com.cn/ 1.创建一个ionic项目,并生成menu1,menu2...
  • Dan_2017
  • Dan_2017
  • 2017年12月11日 16:59
  • 405

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。       压缩规则:       1. 仅压缩连续重复出现的字...
  • qqyuanhao163
  • qqyuanhao163
  • 2015年08月17日 14:49
  • 1557

OC中删除字符串中相邻重复字符

//方法1: 直接在可变字符串上操作, 不返回新字符串 //方法2: 遍历字符串, 如果和前一个字符不相等, 就将该字符拼接到一个可变字符串中...
  • xxxzhikvip
  • xxxzhikvip
  • 2015年11月04日 13:34
  • 356

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

字符串剔除不相邻的重复字符
  • ada19950118
  • ada19950118
  • 2015年11月20日 21:25
  • 1190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串剔除不相邻的重复字符
举报原因:
原因补充:

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