腾讯面试C语言题

题目大致要求:

给定一个字符串,如 aaabbccildf....,让你压缩一下这个字符串,方法是计算每次字符连续出现的次数,若大于1则存该字符出现的次数+该字符,若等于1

则只存该字符,如上面的解答为:3a2b2cildf...,用C语言编写这个程序

我的程序:

#include "stdio.h"
#include "string.h"

int main(){
	char str[1000],comprise[1000];	//str为源字符串,comprise为压缩的字符串

	scanf("%s", str);

	int i,j = 0,times = 0,len = strlen(str);
	char temp = '#', math[32];
	for(i = 0;i < len;i++){	// 遍历整个字符串
		//当当前的字符与上一个字符temp不同时或者其下一个字符时结束符'\0'时
		//开始进行对数字的处理
		//处理方式是先把次数times如果大于0,则处理数字,将数字存入字符串,
		//需要注意的是大于10的数得用多位来存,所以有一个取余后除以10的做法
		if(str[i] != temp || str[i + 1] == '\0'){	
			if(times != 0){	//等于0则表示没有统计过字符,即刚开始
				if(times == 1){
					comprise[j] = temp;
					times = 0;
					j++;
				} else if(times > 1){
					int k = 0;
					while(times != 0){	//这里将times的每一位分离,但存的时候是从0开始的
						math[k] = times % 10 + '0';
						times = times / 10;
						k++;				
					}
					for(k = k - 1;k>=0;k--){//需把数字倒过来
						comprise[j] = math[k];
						j++;
					}
					comprise[j] = temp;
					j++;
				}
			}

			temp = str[i];	//将当前字符存起来,以供与下一个字符比较
			
			times++;//因为本次就不同,应该加一
		} else {
			times++;
		}		
	}

	comprise[j] = '\0';//最后结束压缩的字符串

	printf("The orgin string: %s\n", str);
	printf("The comprised string: %s\n", comprise);

	return 0;
注意:这里得考虑当次数大于9的时候,应该将数字分离为单个数字,存入压缩的字符串

你可能感兴趣的:(C总结)