我正在尝试计算一串字符中最常用的数字,我需要使用指针,但我不知道如何用指针来解决这个问题。
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
答案 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
)会在字符串中找到最后一个字符。