计算C中一串数字中最常用的数字

时间:2018-04-30 22:06:34

标签: c pointers

我正在尝试计算一串字符中最常用的数字,我需要使用指针,但我不知道如何用指针来解决这个问题。

int most(char* string){
    int counter = 0;
    int* array =(int*) malloc(sizeof(int)*10);
    char* original = string;
    while(*original){
        counter++;
        string++;
        //Not sure what to put in this loop
    }
}

例如,我想调用代码

char nums[] = "132433423";
printf("%d \n",most(nums));
// 3

4 个答案:

答案 0 :(得分:2)

您的功能规范不完整:

  • 字符串可以包含非数字字符吗?
  • 如果根本没有数字应该返回什么?
  • 如果有多个具有相同最大出现次数的数字,则应返回哪个值?
  • 函数应该返回数字还是数字值?您的main()函数使用后者,但问题文本中并不清楚。

most函数接收指向字符串的指针。您可以编写一个循环,一次处理一个字符,并递增指针以进行下一次迭代,直到到达字符串的末尾。如果字符串不包含数字,您还必须决定返回什么。

这是一个简单的例子:

int most(const char *s) {
    int count[10] = { 0 };
    int res, i, max;

    while (*s) {
        if (*s >= '0' && *s <= '9')
            count[*s - '0']++;
        s++;
    }
    res = -1;  /* return -1 if no digits */
    max = 0;
    for (i = 0; i < 10; i++) {
        if (count[i] > max)
            res = i;
    }
    return res;
}

如果你完全没有使用任何数组,分配一块内存似乎确实是一个很好的解决方案:

int most(const char *s) {
    int *count = calloc(sizeof(*count), 10);
    int res, i, max;

    while (*s) {
        if (*s >= '0' && *s <= '9')
            *(count + *s - '0') += 1;
        s++;
    }
    res = -1;  /* return -1 if no digits */
    max = 0;
    for (i = 0; i < 10; i++) {
        if (*(count + i) > max)
            res = i;
    }
    free(count);
    return res;
}

符号*(count + *s - '0') += 1以这种方式工作:count是指向由int分配并初始化为0的{​​{1}}数组的指针。 calloc*s - '0'指向的字符的数字值n,已被测试为数字。 s是指向数组中第n个条目的指针。 count + *s - '0'将此值递增1。

有些方法可以在没有内存分配的情况下执行此操作,有10个变量和不同数字的显式测试,但我怀疑这是预期的解决方案。

如果您可以向教师解释您的选择,有两种方法可以使用没有*(count + *s - '0') += 1[字符的数组。这些是C标准的过时功能,大多数程序员都不熟悉,除非你好奇,否则你可以忽略它们:

]

或者

int most(const char *s) {  /* version with C99 digraphs */
    int count<:10:> = { 0 };
    int res, i, max;

    while (*s) {
        if (*s >= '0' && *s <= '9')
            count<:*s - '0':>++;
        s++;
    }
    res = -1;  /* return -1 if no digits */
    max = 0;
    for (i = 0; i < 10; i++) {
        if (count<:i:> > max)
            res = i;
    }
    return res;
}

答案 1 :(得分:0)

我不确定“使用指针”是什么意思,但这里有一个使用指针的版本,除了走输入字符串:

char most_frequent_character(char *s)
  {
  int freq[10];
  int max_freq;
  int max_idx;
  int idx;

  while(*s)
    freq[*s++ - '0']++;  /* compute character freqs */

  max_idx = 0;
  max_freq = freq[0];

  for(idx = 1 ; idx < 10 ; ++idx)
    if(freq[idx] > max_freq)
      {
      max_freq = freq[idx];
      max_idx = i;
      }

  return '0' + max_idx;
  }

玩得开心。

修改

将上述内容转换为“使用指针”:

一个。将freq更改为指向int的指针并使用malloc初始化它;此外,使用freq

初始化memset指向的内存
int *freq = malloc(sizeof(int) * 10);
memset(freq, 0, sizeof(int)*10);

B中。在“计算字符频率”循环中,使用指针引用而不是索引:

while(*s)
  {
  *(freq + (*s - '0')) = *(freq + (*s - '0')) + 1;
  s++;
  }

℃。使用指针引用来设置max_freq的初始值:

max_freq = *freq;

d。在for循环中,使用指针数学而不是索引:

  for(idx = 1 ; idx < 10 ; ++idx)
    if( *(freq + idx) > max_freq)
      {
      max_freq = *(freq + idx);
      max_idx = i;
      }

电子。释放先前在return语句之前分配的内存:

free(freq);
return '0' + max_idx;

现在,坐下来了解为什么事情以他们在这里的方式完成。例如,为什么没有我在计算字符频率时会执行以下操作?

while(*s++)
  *(freq + (*s - '0')) = *(freq + (*s - '0')) + 1;

while(*s)
  *(freq + (*s++ - '0')) = *(freq + (*s++ - '0')) + 1;

上面的每一个都会保存几行代码 - 为什么不应该使用它们? (显而易见的答案是“因为它们无法按预期工作” - 但为什么?)

祝你好运。

答案 2 :(得分:0)

[nums[i]-'0']

我会尽量精心准备:

您可以创建一个字典,其中每个索引对应一个可能出现的数字(0-9)。然后,遍历字符串(基本上是一个字符数组,并将每个数字存储到字典中相应的索引。
注意constructor(private cd: ChangeDetectorRef) { 计算到字典的索引中,因为每个字符都有一个整数值(查找ASCII表)。

该指数的计数器递增以保持该数字的出现次数。

之后,通过字典确定哪个位置是最多出现的数字,并返回该数字。

答案 3 :(得分:0)

您可以先对字符串进行排序,以便较小的数字字符首先出现在num中。您可以使用qsort()(来自stdlib.h

int cmpfn(const void *a, const void *b)
{
    int x = *(char *)a;
    int y = *(char *)b;
    return x-y;
}
int main()
{
    char nums[] = "132433423";//"111222223333";//
    qsort(nums, sizeof(nums)/sizeof(nums[0]) -1, sizeof(nums[0]), cmpfn);
    printf("\nAfter sorting: %s", nums);

    . . . . . . . . . . 
    . . . . . . . . . . 

}

声明变量以存储mode(即数据中最常出现的值)和模式值的频率。

int mode=-1, modecount=-1, n;

现在找到每个数字字符的频率。由于这是一个有序字符数组,因此会连续出现相同的值。

for(char *ptr=nums, *lptr=NULL; *ptr; ptr+=n)
{
    lptr = strrchr(ptr, *ptr);
    n = lptr - ptr + 1;
    if(n>modecount)
    {
        printf("\n%c", *ptr);
        modecount = n;
        mode = *ptr;
    }
}   
printf("\nMode is: %c", mode);

strrchr()(来自string.h)会在字符串中找到最后一个字符。