我知道我们可以用这种方式将数组的每个元素相互比较:
for (f = 0; f < length2; f++) {
for (p = f + 1; p < length2 ; p++) {
if(!(compareThem(split[f],split[p]) == 1) && (split[f] != 0) && (split[p] != 0)) {
no_of_unique++;
}
}
}
但是,我只想在使用索引p的所有元素检查索引f的元素后增加no_of_unique。然而,这用p = f + 1检查元素f,增加no_of_unique,然后检查其他元素并为每种情况增加它。在检查了所有元素后,我只需要增加它。任何帮助,将不胜感激。
P.S compareThem函数基本上只返回1,如果它们彼此相等。
答案 0 :(得分:1)
在内部循环范围内增加 no_of_unique ,而不是在找到等于 split [f] 的元素后中断。然后,在内循环之外,你应该检查 p 是否等于 length2 ,这意味着内循环没有破坏并遍历所有元素直到结束数组。 (即没有遇到等于 split [f] )
的元素for (f = 0; f < length2; f++) {
if (split[f] != 0) {
for (p = 0; p < length2 ; p++) {
if( f != p && (split[p] != 0) && (compareThem(split[f],split[p]) == 1)) {
break;
}
}
if (p == length2) {
no_of_unique++;
}
}
}
答案 1 :(得分:0)
我正在阅读你的问题的方式,因为标题是&#34;将一个元素与所有相同数组中的其他元素进行比较,&#34;您想要查找数组中唯一元素的数量。对于数组中的每个元素,您必须确定它后面是否有重复项,但也必须在它之前。这是一个解决方案。我在我的示例中使用了字符数组,但您可以轻松地将其应用于其他类型。 countUnique()
函数执行正向搜索重复项,当它找到潜在的唯一元素时,alreadyFound()
函数检查前面的元素。:
#include <stdio.h>
#include <string.h>
int countUnique(char arr[], int n);
int compareThem(char c1, char c2);
int alreadyFound(char c, char list[], int n);
int main(void)
{
char test1[] = "abcababdb";
int s_len = strlen(test1);
printf("test1: %d unique elements\n", countUnique(test1, s_len));
return 0;
}
int countUnique(char arr[], int n)
{
int no_of_unique = 0;
int f, p;
for (f = 0; f < n; f++) {
for (p = f + 1; p < n; p++) {
if(compareThem(arr[f],arr[p]) == 1)
break;
}
if (p == n && !alreadyFound(arr[f], arr, f)) {
no_of_unique++;
}
}
return no_of_unique;
}
int compareThem(char c1, char c2)
{
if (c2 - c1)
return 0;
return 1;
}
int alreadyFound(char c, char list[], int n)
{
int i;
for (i = 0; i < n; i++) {
if (c == list[i])
return 1;
}
return 0;
}