如何解决在数组中查找不同的数字
使用以下代码:
public static int countDistinct(int a[])
{
int U_size = 1;
int j; int i;
for ( i = 2; i < a.length; i++ )
{
boolean U = true;
for ( j = 1; j < U_size; j++ )
{
if ( a[j] == a[i] )
{
U = false;
j=U_size;
}
}
if (U=true)
{
U_size = U_size+1;
a[U_size]=a[i];
}
}
return U_size;
}
我编写这个算法是为了找到数组中不同数字的数量并将它们重新排列在数组的开头
但是,例如对于输入的数组:
int arr[] = { 3,1,2,9,5 };
我应该得到输出 5
但我得到的只是 4
并且数组中的元素没有移动到相关位置
请问,有没有人能帮我找出算法中的问题?
解决方法
现在我看到你在做什么,我想我会传递一些可能有用的信息。我消除了 booleans
并且这似乎有效。如果您在外循环上放置一个标签,您可以在遇到可见值时继续该循环。否则,它会失败并更新数组的第一部分和 U_size
。
public static int countDistinct(int a[]) {
int U_size = 1;
outer: for (int i = 1; i < a.length; i++) {
for (int j = 0; j < U_size; j++) {
if (a[i] == a[j]) {
// already seen
continue outer;
}
}
a[U_size++] = a[i];
}
return U_size;
}
这是一种测试方法。
- 创建一个保证有重复值的数组。
- 然后流式传输数组并计算不同的值。
- 然后将该结果与您的结果进行比较。
ThreadLocalRandom r = ThreadLocalRandom.current();
int iterations = 100;
int streamSize = 1000;
int maxRandomNumber = 200;
for (int i = 0; i < iterations; i++) {
int[] testData = r.ints(streamSize,maxRandomNumber).toArray();
long count = Arrays.stream(testData).distinct().count();
int yourCount = countDistinct(testData);
if (count != yourCount) {
System.out.println("Oops!");
}
}
,
查看您的代码,我会改进其中的某些部分。首先,你的代码不影响原始数组的原因是因为是“传值”。这只是意味着传递给方法的编辑参数不会影响您输入的变量。如果您真的想更改列表的顺序,更好的方法是使用返回新列表的方法。
获得唯一值数量的更好方法是使用集合。一个集合最多可以包含每个唯一值中的一个,因此将列表转换为集合,然后获取该集合的大小会告诉您唯一条目的数量。这是我为获得唯一值的数量而要做的:
public static int newCountDistinct(ArrayList<Integer> numbers) {
return (new HashSet<Integer>(numbers)).size();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。