写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为a-z这26个字母和0-9这10个数字)
时间: 2023-05-31 07:20:54 浏览: 246
### 回答1:
1. 定义一个长度为36的数组freq,用于存储每个字符出现的频度,数组下标-25对应a-z这26个字母,下标26-35对应-9这10个数字。
2. 遍历输入字符串,对于每个字符,判断其是否为合法字符,如果是,则将其对应的freq数组元素加1。
3. 将freq数组中的数据写入文件中,每行格式为“字符:频度”,其中字符为对应的字符,频度为对应的freq数组元素值。
算法实现如下:
```
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
int freq[36] = {}; // 初始化为
int len, i;
printf("请输入字符串:");
fgets(str, 100, stdin);
len = strlen(str);
for (i = ; i < len; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
freq[str[i] - 'a']++;
} else if (str[i] >= '' && str[i] <= '9') {
freq[str[i] - '' + 26]++;
}
}
FILE *fp = fopen("result.txt", "w");
if (fp == NULL) {
printf("无法打开文件\n");
return 1;
}
for (i = ; i < 26; i++) {
fprintf(fp, "%c:%d\n", 'a' + i, freq[i]);
}
for (i = ; i < 10; i++) {
fprintf(fp, "%c:%d\n", '' + i, freq[i + 26]);
}
fclose(fp);
printf("结果已保存到result.txt文件中\n");
return ;
}
```
### 回答2:
这个问题可以用Hash表来解决,步骤如下:
1. 定义一个26+10=36大小的数组freqs来存储每个字符的出现频率。
2. 遍历输入字符串,如果字符c合法,即c是'a'到'z'或者'0'到'9'之间的字符,那么就在freqs对应的位置加1。
3. 遍历结束后,将结果写入一个文件中。对于每个合法字符,输出字符和对应的出现频率到文件中,每行一个字符及其频率。如果该字符没有出现过,则不需要在文件中输出。
下面是python代码实现:
```python
def count_freqs(input_str, output_file):
freqs = [0] * 36 # 映射a-z和0-9共36个字符
for c in input_str:
if c.isdigit():
freqs[ord(c)-ord('0')+26] += 1
elif c.isalpha():
freqs[ord(c.lower())-ord('a')] += 1
with open(output_file, 'w') as f:
for i in range(26):
if freqs[i] > 0:
f.write('{} {}\n'.format(chr(i+ord('a')), freqs[i]))
for i in range(26, 36):
if freqs[i] > 0:
f.write('{} {}\n'.format(chr(i-26+ord('0')), freqs[i]))
```
此算法的时间复杂度为O(n),其中n为输入字符串的长度。
### 回答3:
首先,我们可以使用一个数组来存储每个字符出现的次数。数组的大小为36,分别对应26个字母和10个数字。遍历输入字符串时,如果当前字符是合法字符,则将该字符的计数器加1。遍历结束后,将该数组中的结果输出到文件即可。
具体实现可以按照以下步骤进行:
1. 定义一个大小为36的数组count,用于存储每个字符出现的次数。
2. 遍历输入字符串中的每个字符,对于合法字符(即字母和数字),将对应下标的计数器加1。
3. 遍历结束后,将count数组中的结果输出到文件中。可以按照字母表顺序,先输出26个字母的结果,再输出10个数字的结果。
以下是一份示例代码:
```python
import string
# 初始化计数器数组
count = [0] * 36
# 遍历输入字符串,并统计各字符出现次数
for c in input_str:
if c in string.ascii_lowercase: # 判断是否是小写字母
count[ord(c) - ord('a')] += 1
elif c in string.digits: # 判断是否是数字
count[ord(c) - ord('0') + 26] += 1
# 将结果输出到文件中
with open(output_file, 'w') as f:
# 输出字母的结果
for i in range(26):
f.write('{}: {}\n'.format(chr(i + ord('a')), count[i]))
# 输出数字的结果
for i in range(10):
f.write('{}: {}\n'.format(i, count[i+26]))
```
该算法的时间复杂度为O(n),其中n为输入字符串的长度。空间复杂度为O(1),因为计数器数组是固定大小的。
阅读全文