计算字符串中数字出现的频率
Count frequency of digits in string
我需要实现一个可以计算字符串中位数的函数。所以对于数字,但也对于像:aD23b 这样的东西。如果我能让它工作......它应该看起来像:
输入:0912302
输出:
0: 2
1:1
2:2
3:1
4: 0
5:0
6: 0
7:0
8:0
9:1
不幸的是,此时我无法编写任何有用的代码...我的基本想法是:使用循环检查输入中的每个字符,如果是数字,则将其存储在第二个数组中(假设频率).我遇到的问题是我需要以某种方式将每个字符转换为整数或以某种方式能够计算出
通常每个数字都会出现...我希望这可能会起作用,但它根本不起作用:
我忘了说我是编程初学者,所以如果你能给我提示和解释,我将不胜感激。
void calc_occurrences(int s[], int occurrences[])
{
int i = 0;
int j;
int count = 0;
while (s[i] != '[=10=]') {
if (isdigit(s[i])) {
for (j = 0; occurrences[j] != '[=10=]'; j++) {
occurrences[j] = s[i];
}
}
i++;
for (j = i + 1; s[j] != '[=10=]'; j++) {
if (isdigit(s[i]) == isdigit(s[j])) {
count++;
occurrences[j] = 0;
}
}
if(occurrences[i] != 0) {
occurrences[i] = count;
}
}
}
您可以拥有一个大小为 10 且所有索引中都存储 0 的整数数组。然后,当您发现一个数字时,您可以增加相应索引中的数字。
例如,当您看到“0”时,您可以执行 arr[0]++;.
此外,您可以使用 isdigit() 函数检查字符是否为数字。
制作一个数组来计算每个相关字符的出现频率。
像这样:
#include <stdio.h>
void count_freq(char* str, int freq[10])
{
int i = 0;
while(str[i]) // Loop to end of string
{
if (str[i] >= '0' && str[i] <= '9') // Check that the character is in range
{
++freq[str[i]-'0']; // notice the -'0' to get in range 0..9
}
++i;
}
}
int main(void) {
int freq[10] = {0}; // Array to count occurence
char str[] = "0034364hh324h34"; // Input string
count_freq(str, freq); // Calculate frequency
for (int i=0; i < 10; ++i) // Print result
{
printf("%d: %d\n", i, freq[i]);
}
return 0;
}
输出:
0: 2
1: 0
2: 1
3: 4
4: 4
5: 0
6: 1
7: 0
8: 0
9: 0
PS :我知道,我正在回答一个旧的 post,但我在 HackerRank 上做了一些挑战,我设法解决了这个几乎完全相同的问题,以防它可能有所帮助有人因为我在我的代码中使用了动态分配。
/* Problem: hackkerrank.com/challenges/frequency-of-digits-1/problem */
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
char *s;
int *arr;
int i;
i = 0;
s = (char*)malloc(sizeof(char));
scanf("%s", s);
arr = (int*)malloc(10 * sizeof(int));
while(i < 10)
{
*(arr + i) = 0;
i++;
}
i = 0;
while (i < strlen(s))
{
if (*(s + i) >= '0' && *(s + i) <= '9')
{
(*(arr + (*(s + i) - '0'))) += 1;
}
i++;
}
i = 0;
while (i < 10)
{
printf("%d ", *(arr + i)); // As HackerRank problem wanted the output format.
// printf("%d: %d\n", i, *(arr + i)); As you wanted it
i++;
}
return (0);
}
我需要实现一个可以计算字符串中位数的函数。所以对于数字,但也对于像:aD23b 这样的东西。如果我能让它工作......它应该看起来像:
输入:0912302
输出:
0: 2
1:1
2:2
3:1
4: 0
5:0
6: 0
7:0
8:0
9:1
不幸的是,此时我无法编写任何有用的代码...我的基本想法是:使用循环检查输入中的每个字符,如果是数字,则将其存储在第二个数组中(假设频率).我遇到的问题是我需要以某种方式将每个字符转换为整数或以某种方式能够计算出 通常每个数字都会出现...我希望这可能会起作用,但它根本不起作用:
我忘了说我是编程初学者,所以如果你能给我提示和解释,我将不胜感激。
void calc_occurrences(int s[], int occurrences[])
{
int i = 0;
int j;
int count = 0;
while (s[i] != '[=10=]') {
if (isdigit(s[i])) {
for (j = 0; occurrences[j] != '[=10=]'; j++) {
occurrences[j] = s[i];
}
}
i++;
for (j = i + 1; s[j] != '[=10=]'; j++) {
if (isdigit(s[i]) == isdigit(s[j])) {
count++;
occurrences[j] = 0;
}
}
if(occurrences[i] != 0) {
occurrences[i] = count;
}
}
}
您可以拥有一个大小为 10 且所有索引中都存储 0 的整数数组。然后,当您发现一个数字时,您可以增加相应索引中的数字。
例如,当您看到“0”时,您可以执行 arr[0]++;.
此外,您可以使用 isdigit() 函数检查字符是否为数字。
制作一个数组来计算每个相关字符的出现频率。
像这样:
#include <stdio.h>
void count_freq(char* str, int freq[10])
{
int i = 0;
while(str[i]) // Loop to end of string
{
if (str[i] >= '0' && str[i] <= '9') // Check that the character is in range
{
++freq[str[i]-'0']; // notice the -'0' to get in range 0..9
}
++i;
}
}
int main(void) {
int freq[10] = {0}; // Array to count occurence
char str[] = "0034364hh324h34"; // Input string
count_freq(str, freq); // Calculate frequency
for (int i=0; i < 10; ++i) // Print result
{
printf("%d: %d\n", i, freq[i]);
}
return 0;
}
输出:
0: 2
1: 0
2: 1
3: 4
4: 4
5: 0
6: 1
7: 0
8: 0
9: 0
PS :我知道,我正在回答一个旧的 post,但我在 HackerRank 上做了一些挑战,我设法解决了这个几乎完全相同的问题,以防它可能有所帮助有人因为我在我的代码中使用了动态分配。
/* Problem: hackkerrank.com/challenges/frequency-of-digits-1/problem */
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
char *s;
int *arr;
int i;
i = 0;
s = (char*)malloc(sizeof(char));
scanf("%s", s);
arr = (int*)malloc(10 * sizeof(int));
while(i < 10)
{
*(arr + i) = 0;
i++;
}
i = 0;
while (i < strlen(s))
{
if (*(s + i) >= '0' && *(s + i) <= '9')
{
(*(arr + (*(s + i) - '0'))) += 1;
}
i++;
}
i = 0;
while (i < 10)
{
printf("%d ", *(arr + i)); // As HackerRank problem wanted the output format.
// printf("%d: %d\n", i, *(arr + i)); As you wanted it
i++;
}
return (0);
}