华为2014年机试题【字符串压缩】-【C语言/C++】

雪影工作室版权所有,转载请注明【http://blog.csdn.net/lina791211】

一、灵感来源

2013-09-17 | 题目来源 http://blog.csdn.net/net_assassin/article/details/11660869

2013-09-17 | 答案来源 http://blog.csdn.net/net_assassin/article/details/11660869

二、题目

         华为2014年机试题3:

      通过键盘输入一串小写字母(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/C++实现

       

#include <iostream>
#include <cassert>

using namespace std;

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
  const char *p = pInputStr;
  int num = 1;
  int i = 0;
  p++;
  while(*p != NULL)
  {
	  while(*p == *(p-1)&& *p != NULL)
	  {
       num++;
	   p++;
	  }
	  if (num > 1)
	  {
		   int size = 0;
		   int temp = num;
           while(num)             //计算位数
		   {
             size++;
			 num /= 10;
		   }
		   num = 1;

		   for (int j = size; j > 0; j--)
		   {
			   pOutputStr[i+j-1] = '0'+ temp%10;
			   temp /= 10;
		   }
		   i +=size;
		   pOutputStr[i++] = *(p-1);
		   p++;
	  }else{
		  pOutputStr[i++] = *(p-1);
		  p++;
	  }
  }
  pOutputStr[i] = '\0';
}

int main()
{
	char input[] = "cccddecc";
	char *output = new char[strlen(input) + 1];
    stringZip(input,strlen(input),output);
	cout<<output<<endl;
	return 0;
}

四、备用

         原博主 : http://blog.csdn.net/net_assassin/article/details/11660869




你可能感兴趣的:(面试,C语言,机试题,华为)