我如何在二维数组c中逐行删除重复项?

o7jaxewo  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(168)

我有一个int数组,其中包含用户输入的每个单词的ASCII代码,我需要删除重复项,但它就是不起作用。我尝试排序,然后删除,但我甚至不知道它是否真的必要,也许有一个更简单的方法。我想让我的数组,其中包含例如:

127, 113, 127, 127, 109, 0, 0, ...;
105, 109, 114, 105, 0, 0, ...;
102, 101, 101, 101, 0, 0, 0, ....;
102, 0, 0, ....;

look like this:
127, 113, 109, 0, 0, ...;
105,109, 114,105, 0, 0, ...;
102, 101, 0, 0, ...;
102, 0, 0, ...;

我尝试用0替换与j++相同的元素,但似乎不起作用

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 5
#define n 50

int main(void) {
    char arr[N][10] = { 0 };
    int arri[n][n] = { 0 };
    printf("Programm to check if words are anagrams.");
    printf("\nPlease enter your word one by one:\n");
    int y = 0, u = 0;
    for (y = 0; y < N; y++)
    {
        scanf("%s", arr[y]);
    }
        int i = 0, j = 0, k = 0,g=0, num = 0, l = 0, h = 0;
        char *p;
        char *lk;
        int count1 = 0;

        for (;k<N ; l = 0, h++, k++, j = 0, i = 0)
            for (p = &arr[k][j]; *p != '\0'; l++) //convert char into int
            {
                p = &arr[k][j];
                arri[h][i] = int(*p);
                i++;
                j++;
            }
        
        for (j = 0;i<n; i++)
        {
            for (;j<n;j++)
            {
                int k = j + 1;
                if (arri[i][j] == arr[i][k] && arri[i][k] != 0)
                {
                    arri[i][k] = 0; // not chaning the same element with 0
                }
                
            }
        }
    
}
tjrkku2a

tjrkku2a1#

要从ASCII代码数组中删除重复项,可以使用以下方法:
1.对数组排序。这将把所有重复项组合在一起,从而更容易删除它们。
1.循环访问数组并跟踪当前元素以及到目前为止该元素出现的次数。
1.如果当前元素与前一个元素相同,则递增计数。如果不同,则将计数重置为1。
1.如果计数大于1,则跳过当前元素。否则,将当前元素复制到新数组中的下一个可用位置。
1.到达数组末尾时,新数组将包含原始数组中的所有唯一元素。
下面是演示此方法的一些示例代码:

#include <stdio.h>
#include <stdlib.h>

// Compare function for qsort
int compare(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}

int main() {
    // Input array
    int arr[] = {127, 113, 127, 127, 109, 0, 0, 105, 109, 114, 105, 0, 0, 102, 101, 101, 101, 0, 0, 0, 102, 0, 0};

// Sort the array
qsort(arr, sizeof(arr) / sizeof(int), sizeof(int), compare);

// Output array
int out[sizeof(arr) / sizeof(int)];

// Index into the output array
int outIndex = 0;

// Current element and count
int current = arr[0];
int count = 1;

// Iterate through the array
for (int i = 1; i < sizeof(arr) / sizeof(int); i++) {
    // If the current element is the same as the previous element, increment the count
    if (arr[i] == current) {
        count++;
    }
    // Otherwise, reset the count to 1
    else {
        count = 1;
        current = arr[i];
    }

    // If the count is 1, copy the current element to the output array
    if (count == 1) {
        out[outIndex] = current;
        outIndex++;
    }
}

// Print the output array
for (int i = 0; i < outIndex; i++) {
    printf("%d ", out[i]);
}
printf("\n");

return 0;
}
ohtdti5x

ohtdti5x2#

使用的OP变量:一个月一个月、一个月一个月、一个月二个月一个月、一个月三个月一个月、一个月四个月一个月、一个月五个月一个月、一个月六个月一个月、一个月七个月一个月、一个月八个月一个月、一个月九个月一个月、一个月十个月一个月、一个月十一个月
有人觉得这有什么问题吗?
保持简单。下面的代码将数组(一个C字符串,得益于尾部的'\0')"压缩"到自身中,删除第二次及以后出现的任何字符。除了数组本身,这只涉及两个变量:一米十三寸和一米十四寸。
技巧是要认识到,当单独考虑时,第0个字符显然是该字符的第一次出现。第一个嵌套循环扫描字符串中每个字符的后续出现。那些"重复"被替换为第0个字符的副本。第二个循环只是"压缩"所有第0个字符的重复。

int main( void ) {
    char arr[] = "nn-n-ow is the time for all good men to come to the aid of the party";

    puts( arr );
    int i, j;
    for( i = 1; arr[i]; i++ )
        for( j = i+1; arr[j]; j++ )
            if( arr[j] == arr[i] ) // repeat?
                arr[j] = arr[0];   // replace!
    for( i = 1, j = 1; arr[j]; j++ )
        if( arr[j] != arr[0] )
            arr[i++] = arr[j]; // compact
    arr[i] = '\0'; // terminate
    puts( arr );

    return 0;
}
nn-n-ow is the time for all good men to come to the aid of the party
n-ow isthemfralgdcpy

注:这是为了演示。如果需要,可以将unsigned char *指针定义为文字arr[]的 * stand-in *,以处理这些1字节整数值。对于此演示,ASCII字符的C字符串是最方便的表示。
一个微不足道的优化是在扫描过程中"跳过"第0个字符的示例,并且不再继续扫描更多的示例。(即:外循环可以"捷径"以避免运行内循环。

相关问题