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

 个人想把博客写的有营养一些,但有些力不从心,小生目前技术还没到位,所以,博客也就成了我的笔记本,写一些关于代码的心得。
 废话不多说,进入主题。
 今天,在看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:@" "];
            }
        }
    }

代码运行最终的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,可以使用OpenCV库中的SIFT算法进行特征点匹配,然后使用哈希表来存储每个图像的特征向量,以此来判断是否存在相同的图像。 具体步骤如下: 1. 导入必要的库:cv2、os、hashlib ```python import cv2 import os import hashlib ``` 2. 定义一个函数,用于计算图像的哈希值。这里使用的是dHash算法,即差异哈希算法。 ```python def dhash(image, hashSize=8): # 缩放图像尺寸,并转换为灰度图像 gray = cv2.cvtColor(cv2.resize(image, (hashSize+1, hashSize)), cv2.COLOR_BGR2GRAY) # 计算相邻像素的差值 diff = gray[:, 1:] > gray[:, :-1] # 将差值转换为哈希值(二进制字符串) return hashlib.md5(diff).hexdigest() ``` 3. 遍历文件夹中的所有图像,计算每个图像的哈希值,并将哈希值与图像路径存储到字典中。 ```python imagePaths = {} for file in os.listdir(folder): imagePath = os.path.join(folder, file) # 读取图像,并计算哈希值 image = cv2.imread(imagePath) hash = dhash(image) # 将哈希值与图像路径存储到字典中 if hash not in imagePaths: imagePaths[hash] = [imagePath] else: imagePaths[hash].append(imagePath) ``` 4. 遍历字典中的所有哈希值,如果哈希值对应的图像数量大于1,则说明存在相同的图像。此时可以将其中一个图像路径保存到结果字典中。 ```python results = {} for hash, paths in imagePaths.items(): if len(paths) > 1: # 存在相同的图像,将其中一个图像路径保存到结果字典中 results[hash] = paths[0] ``` 最终,可以得到一个字典,其中键为相同图像的哈希值,值为其中一个图像的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值