zoukankan      html  css  js  c++  java
  • 旧题新解

    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;

    }

    http://www.cnblogs.com/PaulpauL/ 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    抽象工厂学习笔记
    SQL Transcation的一些总结
    享元模式(Flyweight)
    编程语言简史
    代理模式(Proxy)
    打造属于你的提供者(Provider = Strategy + Factory Method)
    打造属于你的加密Helper类
    单例模式(Singleton)的6种实现
    在C#中应用哈希表(Hashtable)
    InstallShield脚本语言的编写
  • 原文地址:https://www.cnblogs.com/PaulpauL/p/4722456.html
Copyright © 2011-2022 走看看