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/ 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/PaulpauL/p/4722456.html
Copyright © 2011-2022 走看看