Java 未排序数组中正整数的排序
这是在最近的一次节目采访中给我的。我得到了一个包含正负值的未排序整数数组,需要对它们进行排序,但只针对正值。我想知道如果不使用谷歌,你的一些解决方案可能是什么 回家后,我找到了数组。sort()按升序对数组进行排序,但我不确定如何仅以正值输出到新数组,因为这是一项要求。如果它们大于-1,我可以通过打印来打印它们,但是我如何将它们输入到新数组中,而不必通过数组循环并计算正值的数量来获得新数组的大小,实例化新数组,然后再次循环以将它们添加到新数组中。。这个解决方案似乎不是最优的,有更好的方法吗 输出需要是一个只包含正值的新数组,即已排序的数组 以下是我目前掌握的信息:Java 未排序数组中正整数的排序,java,arrays,sorting,Java,Arrays,Sorting,这是在最近的一次节目采访中给我的。我得到了一个包含正负值的未排序整数数组,需要对它们进行排序,但只针对正值。我想知道如果不使用谷歌,你的一些解决方案可能是什么 回家后,我找到了数组。sort()按升序对数组进行排序,但我不确定如何仅以正值输出到新数组,因为这是一项要求。如果它们大于-1,我可以通过打印来打印它们,但是我如何将它们输入到新数组中,而不必通过数组循环并计算正值的数量来获得新数组的大小,实例化新数组,然后再次循环以将它们添加到新数组中。。这个解决方案似乎不是最优的,有更好的方法吗 输出
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] unsorted = {
-3, 95, -4, 20, 5, 6, 8
};
int[] sorted = unsorted;
Arrays.sort(sorted);
for (int s: sorted) {
if (s > -1)
System.out.println(s);
}
}
}
在Java中,必须是稳定的,因此如果您使用的比较器表示所有负数都相等,但正数满足您的期望,那么您就可以得到所需的值。您可以尝试将数据放在一个数组中,确保只处理正值:
int[] unsorted = { -3, 95, -4, 20, 5, 6, 8 };
PriorityQueue<Integer> q = new PriorityQueue<>(unsorted.length);
for (int a : unsorted) {
if (a > 0)
q.add(a);
}
while (!q.isEmpty()) {
System.out.println(q.poll());
}
int[]未排序={-3,95,4,20,5,6,8};
PriorityQueue q=新的PriorityQueue(未排序的.length);
for(int a:未排序){
如果(a>0)
q、 添加(a);
}
而(!q.isEmpty()){
System.out.println(q.poll());
}
5.
6.
8.
20
95
这种方法是O(nlog(n)),其中n是数组中正整数的数目。相反,整个数组的排序将是O(nlog(n)),其中n是整个数组的长度
如果在排序的数组上对
0
执行二进制搜索,然后仅打印该点的值,会怎么样Arrays.binarySearch()
返回0
在数组中找不到0
时所处的索引
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] unsorted = {
-3, 95, -4, 20, 5, 6, 8
};
int[] sorted = unsorted;
Arrays.sort(sorted);
int breakingPoint = Arrays.binarySearch(sorted, 0);
for (int i = breakingPoint; i < sorted.length; i++) {
System.out.println(sorted[i]);
}
}
}
导入java.util.array;
公开课考试{
公共静态void main(字符串[]args){
int[]未排序={
-3, 95, -4, 20, 5, 6, 8
};
int[]已排序=未排序;
数组。排序(已排序);
int breakingPoint=Arrays.binarySearch(排序,0);
for(int i=断点;i
您应该制定自己的排序算法。我会在面试中使用经过修改的快速排序:
1-选择0作为第一个递归调用的轴心,并将所有等于或大于0的数字放在右侧数组中
右数组上的2-Only call快速排序对于第一个递归调用,对于其他递归调用,使用随机透视
3-连接时,删除找到的第一个0
Fast(nlogN),您甚至可以在同一阵列中执行此操作,或者返回一个新阵列 仅为动态特性创建列表可能意味着在删除过程中多次调整阵列的大小 我选择使用
Arrays.copyOf
来调整数组的大小,因为我知道数组需要多大
我做的第一件事就是过滤掉底片:
int[] unsorted = {
-3, 95, -4, 20, 5, 6, 8
};
int[] positives = new int[unsorted.length]; //It can only be as big as unsorted.
int i = 0, j = 0;
for (; i < unsorted.length; i++) {
if (unsorted[i] >= 0)
positives[j++] = unsorted[i];
}
最后,我对其进行排序:
Arrays.sort(positives);
这里有一个简单的分隔正数的方法-它需要一份副本
List<Integer> positives = new ArrayList<Integer>();
for (Integer number: unsorted) {
if (number > 0) {
positives.add(number);
}
}
你说的听起来像是过滤+排序。“输出到只有正值的新数组”。是否要一个只包含正值的新数组,即已排序的数组。或者你的意思是你想要一个既有负值又有正值的新数组,但是只对正值进行排序。这个问题没有明确说明。什么是“排序但只针对正值”呢?我觉得这个面试问题的目的是检查你是否真正理解排序的过程。这在采访中是相关的,因为编写自定义排序逻辑在许多编程职位上都是经常发生的事情。我想你想要一个只有正值的新数组吗,即sortedIf给定语言的选择,我会使用C#,并说
unsorted.Where(I=>I>0).OrderBy(I=>I.ToArray()
这存在的问题是n
是原始数组的大小,而不是n
是排序的O(n log n)
的正整数数。对于少量负数来说,这不是什么大问题,但对于大型数组来说,这是一个大问题。现在我想起来了,你是对的。对于排序而言,减少n(即O(nlog(n))会更有效,而对于检查正数,则会使n更大,即O(n)。不过,我会留下这个答案,因为您提供了一些有价值的见解。为什么需要第(4)步?值数组不是您想要的数组吗?因为负数也很重要:-)为什么要声明它们?答案是固定的。虽然,优先级队列确实是最好的答案,但你从哪里得到O(nlog(n))?Javadoc for Priority Queue表示实现注意:这个实现为enqueing和dequeing方法提供了O(log(n))时间。这只是一种伪装的堆排序。实际上,您不需要步骤(3),因为第一步已经告诉您停止的位置。这听起来也像是面试官想要的答案。嗯,是的,只要枢轴不是0,他就可以继续连接。请对你否决这个答案的决定发表评论。
Arrays.sort(positives);
List<Integer> positives = new ArrayList<Integer>();
for (Integer number: unsorted) {
if (number > 0) {
positives.add(number);
}
}
Collections.sort(positives);