【问题标题】:Counting unique characters in a 2D array计算二维数组中的唯一字符
【发布时间】:2020-11-24 15:05:11
【问题描述】:

我创建了一个函数,用于计算 2D 字符数组中唯一字符的数量,该函数根据唯一字符的数量是高于还是低于网格的宽度或高度来返回真/假。

我想知道是否有更简单的方法在 c90 中实现 uniqueChars 函数。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>

#define MAXGRIDHW 9

typedef enum bool{ false = 0, true = 1 } bool;

typedef struct node{
    char grid[MAXGRIDHW][MAXGRIDHW];
    int height;
    int width;
    int parent;
} Node;

bool uniqueChars(Node* b);
void setHeightWidth(Node* b, int h, int w);
void clearNode(Node* b);

int main (void)
{
    Node shelf1[10];

    char testArr2[3][4] = {{"z.."},
                           {"q.."},
                           {"z.."}};    

   clearNode(&shelf1[2]);

   memcpy(&shelf1[2].grid, testArr2, 7);

   setHeightWidth(&shelf1[2], 3, 4);

   assert(uniqueChars(&shelf1[2]) == true);

   return 0;
}

bool uniqueChars(Node* b)
{
    int i, j, chars = 0;
    bool appears;

    for (i = 0; i < MAXGRIDHW; i++) {
        for (j = 0; j < MAXGRIDHW; j++) {
            b->grid[i][j] = toupper(b->grid[i][j]); 
            if (b->grid[j] == b->grid[i]) {
               appears = true;
               break;
            }
        }
        if (!appears) {
            chars++;
        }
    }

    if (b->height < chars || b->width < chars) {
        return false;
    }
    return true;
}



void setHeightWidth(Node* b, int h, int w)
{
    b->height = h;
    b->width = w;
}

【问题讨论】:

  • 您的uniqueChars 是错误的,因为 1. 条件b-&gt;grid[j] == b-&gt;grid[i] 是比较指针。在第一次迭代时总是如此i = 0, j = 0,因此毫无意义。 2. appears 的值可以在修复后不用初始化就可以使用。未初始化的非静态局部变量的值是不确定的,使用这些值会调用未定义的行为
  • 我该如何解决问题 1? j = i + 1?
  • uniqueChars 真的应该使用toupper() 修改网格的内容吗? uniqueChars 不应该使用网格的设置高度和宽度,而不是最大高度和宽度吗?
  • 我打算稍后将 toupper() 移动到另一个函数,我只想要相同字母的实例,只是大写和小写,被视为 1。是的,现在我应该使用我实际设置的高度/宽度

标签: arrays c char


【解决方案1】:

统计每个字符出现的次数:

int numchars[256];
memset(numchars, 0, 256*sizeof(int));

for (int i = 0; i < MAXGRIDHW; i++) {
    for (int j = 0; j < MAXGRIDHW; j++) {
        ++numchars[toupper(b->grid[i][j])];
    }
}

然后遍历numchars数组,看看哪些字符只出现一次。

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2019-05-16
    • 2017-04-07
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多