欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA面试题--两个正序排序的数组,求合并后的第K个(非算法)

程序员文章站 2024-03-16 13:03:28
...

JAVA面试

群里大佬们讨论的面试题,不知道这样是不是答案,记录一下,感觉符合任何数组,但是没有用正序排序这个点,所以不知道是不是最优解,有兴趣的朋友可以互相探讨一下,题目如下:
两个正序排序的数组,求合并后的第K个。两个数组内元素没有 0,找不到第 K 个数可以返回 0。
例如:数组1–》[1, 13, 16, 20],数组2–》[2, 8, 12, 27],第K=5个数为13
=注意=
要求:
1、不要申请额外的空间,比如:数组、List、Set、Map;变量定义的是可以;
2、不要使用java的sort相关函数,当然也不要自己手写冒泡排序,本题不是考察排序算法;
3、需要写单元测试,写在 Code1_Test 内;
4、穷举想到的测试边界case,而不仅仅是题目中示例的case;

// An highlighted block
public static void main(String[] args) {
	int[] s1 = new int[4];
	int[] s2 = new int[4];
	s1[0] = 1;
	s1[1] = 13;
	s1[2] = 16;
	s1[3] = 20;
		
	s2[0] = 2;
	s2[1] = 8;
	s2[2] = 12;
	s2[3] = 27;
	for (int i = 1; i < 9; i++) {
			System.out.println(i+"结果:"+find(i,s1,s2));
		}
	}
	private static int newFind(int k, int[] a, int[] b) {
    	int al = a.length;
		int bl = b.length;
		int kval = 0;
		int val = 0;//每一个数组的值(第一次循环)
		int ab = 0;//每一个数组的值(第二次循环)
		
		for (int i = 0; i < (al+bl); i++) {
			if(i<al) {
				val = a[i];
			}else {
				val = b[i-al];
			}
			int bigger = 0;//有几个数比K的值大
			int smaller = 0;//有几个数比K的值小
			int equal = 0;//相等的数有几个
			for (int j = 0; j < (al+bl); j++) {
				if(j<al) {
					ab = a[j];
				}else {
					ab = b[j-al];
				}
				if(val>ab) {
					smaller++;
				}else if(val<ab){
					bigger++;
				}else {
					equal++;
				}
			}
			//System.out.println("k="+k+","+val+"的比较结果:smaller="+smaller+",bigger="+bigger+",equal="+equal);
			if(0<k-smaller&&k-smaller<=equal) {
				kval = val;
			}
		}
		
		return kval;
    }