当前位置: 代码迷 >> C# >> 2013华为校园招聘考试题
  详细解决方案

2013华为校园招聘考试题

热度:84   发布时间:2016-05-05 03:10:45.0
2013华为校园招聘试题
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 
pInputStr:  输入字符串
lInputLen:  输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“cccddecc”   输出:“3c2de2c”
输入:“adef”     输出:“adef”
输入:“pppppppp” 输出:“8p”

用C#实现

------解决思路----------------------
static string GetStringR(string inputStr)
        {
            return Regex.Replace(inputStr, @"([a-zA-Z])\1{1,}", x =>
             {
                 return string.Format("{0}{1}", x.Length, x.Value[0]);
             });
        }

------解决思路----------------------
static string GetStringWithoutRegex(string inputStr)
        {
            if (string.IsNullOrEmpty(inputStr) 
------解决思路----------------------
 !Regex.IsMatch(inputStr, @"^[a-z]+$"))
            {
                throw new ArgumentException();
            }
            List<char> tmp = new List<char>();
            var nowIndex = 0;
            var nowChar = inputStr[0];
            //ascii 48对应0
            for (var i = 1; i <= inputStr.Length; i++)
            {
                var chari_1 = inputStr[i - 1];
                var chari = i == inputStr.Length ? '\0' : inputStr[i];
                if (chari != chari_1)
                {
                    var num = i - nowIndex;
                    if (num > 1)
                    {
                        tmp.Add((char)(num + 48));
                    }
                    nowIndex = i;
                    tmp.Add(chari_1);
                }
            }
            return new String(tmp.ToArray());
        
  相关解决方案