我有一个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
}
}
}
}
2条答案
按热度按时间tjrkku2a1#
要从ASCII代码数组中删除重复项,可以使用以下方法:
1.对数组排序。这将把所有重复项组合在一起,从而更容易删除它们。
1.循环访问数组并跟踪当前元素以及到目前为止该元素出现的次数。
1.如果当前元素与前一个元素相同,则递增计数。如果不同,则将计数重置为1。
1.如果计数大于1,则跳过当前元素。否则,将当前元素复制到新数组中的下一个可用位置。
1.到达数组末尾时,新数组将包含原始数组中的所有唯一元素。
下面是演示此方法的一些示例代码:
ohtdti5x2#
使用的OP变量:一个月一个月、一个月一个月、一个月二个月一个月、一个月三个月一个月、一个月四个月一个月、一个月五个月一个月、一个月六个月一个月、一个月七个月一个月、一个月八个月一个月、一个月九个月一个月、一个月十个月一个月、一个月十一个月
有人觉得这有什么问题吗?
保持简单。下面的代码将数组(一个C字符串,得益于尾部的
'\0'
)"压缩"到自身中,删除第二次及以后出现的任何字符。除了数组本身,这只涉及两个变量:一米十三寸和一米十四寸。技巧是要认识到,当单独考虑时,第0个字符显然是该字符的第一次出现。第一个嵌套循环扫描字符串中每个字符的后续出现。那些"重复"被替换为第0个字符的副本。第二个循环只是"压缩"所有第0个字符的重复。
注:这是为了演示。如果需要,可以将
unsigned char *
指针定义为文字arr[]
的 * stand-in *,以处理这些1字节整数值。对于此演示,ASCII字符的C字符串是最方便的表示。一个微不足道的优化是在扫描过程中"跳过"第0个字符的示例,并且不再继续扫描更多的示例。(即:外循环可以"捷径"以避免运行内循环。