2013华为校园招聘试题

时间:2021-02-01 18:52:16
通过键盘输入一串小写字母(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#实现

11 个解决方案

#1


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]);
             });
        }

#2


引用 1 楼 starfd 的回复:
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]);
             });
        }


二楼的好给力。。。

#3


引用 1 楼 starfd 的回复:
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]);
             });
        }


好厉害啊

#4


呵呵,我可以很负责任地说,如果题目是这样出的,使用正则一定就被面试失败了。

你可以想一下,人家出题的目的要求什么效率,而正则处理是什么效率?更何况这是华为面试。

#5


真心是想不出来

#6


及格的写法
        static string stringZip(string inputStr)
        {
            string outputStr = "";
            int i = 0, l = 0;
            for(; i < inputStr.Length; i++)
            {
                if (inputStr[i] != inputStr[l])
                {
                    if (i - l > 1) outputStr += (i - l).ToString();
                    outputStr += inputStr[l];
                    l = i;
                }                
            }
            if (i - l > 1) outputStr += (i - l).ToString();
            outputStr += inputStr[l];                    
            return outputStr;
        }

#7


这样可能好点
        static string stringZip(string inputStr)
        {
            string outputStr = "";
            var n = 1;
            for (int i = 0; i < inputStr.Length; i++)
            {
                if (i < inputStr.Length - 1 && inputStr[i + 1] == inputStr[i]) n++;
                else
                {
                    outputStr += (n > 1 ? n.ToString() : "") + inputStr[i];
                    n = 1;
                }
            }
            return outputStr;
        }

#8


这些个都是1233

#9


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());
        

#10



static string stringZip(string inputStr)
{
    string outputStr = "";
    for (int i = 0; i < inputStr.Length; i++)
    {
        int x = 1;
        while (i < inputStr.Length - 1 && inputStr[i] == inputStr[i + 1])
        {
            x++;
            i++;
        }
        if (x > 1) outputStr += x.ToString();
        outputStr += inputStr[i];
    }
    return outputStr;
}

#11


2013华为校园招聘试题

刚才试了下,正则确实比直接的字符函数效率低了点,这个是什么原因呢?

#1


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]);
             });
        }

#2


引用 1 楼 starfd 的回复:
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]);
             });
        }


二楼的好给力。。。

#3


引用 1 楼 starfd 的回复:
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]);
             });
        }


好厉害啊

#4


呵呵,我可以很负责任地说,如果题目是这样出的,使用正则一定就被面试失败了。

你可以想一下,人家出题的目的要求什么效率,而正则处理是什么效率?更何况这是华为面试。

#5


真心是想不出来

#6


及格的写法
        static string stringZip(string inputStr)
        {
            string outputStr = "";
            int i = 0, l = 0;
            for(; i < inputStr.Length; i++)
            {
                if (inputStr[i] != inputStr[l])
                {
                    if (i - l > 1) outputStr += (i - l).ToString();
                    outputStr += inputStr[l];
                    l = i;
                }                
            }
            if (i - l > 1) outputStr += (i - l).ToString();
            outputStr += inputStr[l];                    
            return outputStr;
        }

#7


这样可能好点
        static string stringZip(string inputStr)
        {
            string outputStr = "";
            var n = 1;
            for (int i = 0; i < inputStr.Length; i++)
            {
                if (i < inputStr.Length - 1 && inputStr[i + 1] == inputStr[i]) n++;
                else
                {
                    outputStr += (n > 1 ? n.ToString() : "") + inputStr[i];
                    n = 1;
                }
            }
            return outputStr;
        }

#8


这些个都是1233

#9


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());
        

#10



static string stringZip(string inputStr)
{
    string outputStr = "";
    for (int i = 0; i < inputStr.Length; i++)
    {
        int x = 1;
        while (i < inputStr.Length - 1 && inputStr[i] == inputStr[i + 1])
        {
            x++;
            i++;
        }
        if (x > 1) outputStr += x.ToString();
        outputStr += inputStr[i];
    }
    return outputStr;
}

#11


2013华为校园招聘试题

刚才试了下,正则确实比直接的字符函数效率低了点,这个是什么原因呢?