旧题新解

6. 传入一段字符串,把相同的字符按出现顺序,归在一起,并压缩(20分)

比如:输入: SamSameCome

输出:  SSaammmeeCo

S2a2m3e2C1o1

返回值为压缩后的结果,比如S2a2m3e2C1o1

//测试代码

/*********************************************************************/

    NSLog(@"6. 传入一段字符串,把相同的字符按出现顺序,归在一起,并压缩(20分)");

    NSLog(@"传入字符串%@,归并后字符串为%@",@"SameSameCom",[Test compressString:@"SameSameCom"]);

/*********************************************************************/

//原来的解法

+ (NSString *)compressString:(NSString *)s

{

    NSMutableArray *sa=[[NSMutableArray alloc] init];

    NSMutableArray *sa1=[[NSMutableArray alloc] init];

    //将字符串存入可变数组

    for(int i=0;i<[s length];i++)

    {

        NSString *s1=[[NSString alloc] initWithFormat:@"%c",[s characterAtIndex:i]];

        [sa addObject:s1];

    }

    //初始化第一个元素

    [sa1 addObject:[sa objectAtIndex:0]];

    [sa removeObjectAtIndex:0];

    //遍历sa,一旦遇到与sa1相同的则移除,再次遍历,知道sa移空

    while([sa count]!=0)

    {

        for (int j=0; j<[sa count]; j++)

        {

            if([[sa1 objectAtIndex:([sa1 count]-1)]isEqualTo:[sa objectAtIndex:j]])

            {

                [sa1 addObject:[sa objectAtIndex:j]];

                [sa removeObjectAtIndex:j];

                j=0;

            }

        }

        //遍历完一次把一种相同字母放到一起,接下来存入sa开头的元素

        if([sa count] !=0)

        {

            [sa1 addObject:[sa objectAtIndex:0]];

            [sa removeObjectAtIndex:0];

        }

    }

    //相同字母移动到一起存入sa1

    int count=1;

    int flag=0;

    NSMutableArray *arr=[[NSMutableArray alloc] init];

    for (int i=0; i<[sa1 count]; i++)

    {

        //判断最后一个元素是否与前一个元素相同

        if(i==([sa1 count]-1))

        {

            if([sa1 objectAtIndex:i]!=[sa1 objectAtIndex:i-1])

            {

                [arr addObject:[sa1 objectAtIndex:i]];

                [arr addObject:@"1"];

            }

        }

        else

        {

            [arr addObject:[sa1 objectAtIndex:i]];

        }

        //count记录每个字母出现的次数,换到下一个字母时初始化为1

        //flag标记是否遇到不同的字母,或所有字母是否读完

        count=1;

        flag=0;

        for (int j=i; j<[sa1 count]-1; j++)

        {

            //判断相同字母总共有几个

            if([[sa1 objectAtIndex:i] isEqualTo:[sa1 objectAtIndex:j+1]])

            {

                count++;

                if(j+1==([sa1 count]-1))

                {

                    flag++;

                }

            }

            else

            {

                flag++;

            }

            //如果flag遇到不同的字母,或所有字母是否读完,把字母个数存入sa1

            if(flag)

            {

                NSString *scount=[[NSString alloc] initWithFormat:@"%d",count];

                [arr addObject:scount];

                //如果j等于数组长度少1表明已经读取完毕

                if(j!=[sa1 count]-1)

                {

                    i=j;

                }

                break;

            }

        }

    }

    NSString *ss=[arr componentsJoinedByString:@""];

    return ss;

}

 

//新解法

+ (NSString *)compressString:(NSString *)s

{

    int arr[100]={};

    for(int i=0; i<[s length]; i++)

    {

        arr[[s characterAtIndex:i]-'A']++;

    }

    NSMutableArray *mArr=[[NSMutableArray alloc] init];

    for(int i=0;i<100;i++)

    {

        if(arr[i]!=0)

        {

            [mArr addObject:[NSString stringWithFormat:@"%c",(i+'A' )]];

            [mArr addObject:[NSString stringWithFormat:@"%d",arr[i]]];

        }

    }

    NSString *s1=[mArr componentsJoinedByString:@""];

    return s1;

}

posted @ 2015-08-11 21:50  BuddyLiu  阅读(273)  评论(0编辑  收藏  举报