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