- 編程題:RLE算法,編寫一個(gè)函數(shù),實(shí)現(xiàn)統(tǒng)計(jì)字符次數(shù)的功能:例如輸入為aaabbccc,輸出為a3b2c3。不限語(yǔ)言。
這是一道算法題
1.首先我們得分析輸入字符的肯能性
1).輸入aaabbccc ,輸出 a3b2c3,重復(fù)的字符在一起,這種是最簡(jiǎn)單的
2).輸入AAaaabbBBcccC ,輸出 A2B2C1a3b2c3,大小寫字母放在一起,和第一種類似
3).輸入abaaccbc ,輸出 a3b2c3,重復(fù)的字符沒在一塊,我們需要逐一找到重復(fù)的字符,相對(duì)比較麻煩些。
4).輸入abaAaBBcCcCCbc ,輸出 A1B2C3a3b2c3,與第三種類似
目前大體上就是這四種輸入的可能性。
2.根據(jù)輸入的字符串找到規(guī)律
通過輸入的字符串,我們可以確定只有字母(大小寫),所以我們所要統(tǒng)計(jì)的字符種類就只有52種,在ASCII碼表中"A" 的十進(jìn)制是 65,"a" 的十進(jìn)制是97,因此通過對(duì)應(yīng)關(guān)系我們可以定義一個(gè)容量大小為58(為什么是58而不是52,這是因?yàn)閍和A之前差了32,盡管中間有6個(gè)字符沒用,但是為了方便處理,所以多定義6個(gè)字符的空間)的數(shù)組分別存每個(gè)字符出現(xiàn)的次數(shù),這樣就可以解決這個(gè)問題了。
3.根據(jù)2的規(guī)律編寫c程序
代碼如下
void c_sumOfCharacters(char * str){
int i = 0;
int num[58] = {0};
while (str[i] != '\0') {
if ('A' <= str[i] && str[i] <= 'Z') {
int index = str[i] - 'A';
num[index] = num[index]+1;
}else if ('a' <= str[i] && str[i] <= 'z'){
int index = str[i] - 'a' + 32;
num[index] = num[index]+1;
}
i++;
}
for (int i = 0; i < 58; i++) {
int count = num[i];
if (count != 0) {
char c = 'A'+i;
printf("%c%d",c,count);
}
}
}
輸入:AbbFFeeewwQQQAFF
輸出:A2F4Q3b2e3w2
4.oc代碼
oc的實(shí)現(xiàn)邏輯相比較c語(yǔ)言有比較大的差別,沒有運(yùn)用2中所描述的規(guī)律,不過用了oc中字典的特性,不可重復(fù)的特性,我是用了一個(gè)數(shù)組保存找到的字符和出現(xiàn)的次數(shù),用字符作為鍵,出現(xiàn)的次數(shù)作為值,具體代碼如下:
-(void)oc_sumOfCharacters:(NSString*)str{
//保存每種字符出現(xiàn)的次數(shù) key是字符 value 是字符出現(xiàn)的次數(shù)
NSMutableDictionary * resultDic = [NSMutableDictionary dictionaryWithCapacity:0];
for (int i = 0; i < str.length; i++) {
//取出i位置的字符
NSString * charStr = [self indexCharForStr:str index:i];
if (charStr == nil) {
continue;
}
//獲取所有的key
NSArray * resultKeys = resultDic.allKeys;
//判斷字符是否在里面
if ([resultKeys containsObject:charStr]) {
//存在 取出該字符出現(xiàn)的次數(shù) 加1再重新設(shè)置
NSInteger count = [[resultDic objectForKey:charStr] integerValue];
[resultDic setValue:@(count + 1) forKey:charStr];
}else{
//不存在 將該字符存到resultDic中
[resultDic setValue:@(1) forKey:charStr];
}
}
NSMutableString * resultStr = [NSMutableString string];
[resultDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[resultStr appendFormat:@"%@%@",key,obj];
}];
NSLog(@"%@",resultStr);
}
其中對(duì)于取出字符串某個(gè)位置的字符我是用了字符串截取的方法實(shí)現(xiàn)了獲取某一位置的字符的方式代碼如下:
//取出字符串對(duì)應(yīng)位置的字符
-(NSString *)indexCharForStr:(NSString *)aimStr index:(NSInteger)index{
if (index >= aimStr.length) {
return nil;
}
if (index > 0) {
NSString * subToStr = [aimStr substringToIndex:index+1];
return [subToStr substringFromIndex:index];
}else{
return [aimStr substringToIndex:1];
}
return nil;
}
輸入:AeeDeewzaaaAAA
輸出:A4w1D1e4z1a3
想要試的可以直接復(fù)制代碼進(jìn)行嘗試,有更好的方法也歡迎討論交流。