2020年12月29日,下午14点,我面试了一次百度。
【百度视频面试题】给你两个整数组成的数组,请返回打印出那个比较大的数组的数,组成的新数组
array1={1,2,3,4,5,6}
array2={2,3,4}
answer={5,6}
请使用java语言编写给出答案
Java中数组获取最大值
实现思路:
1、先确定两个数组,哪一个比较大?获取到各自最大的数值。
2、遍历大的那个数组,和比较小的数组最大的值(矮子里的将军数)比较。
3、分类讨论情况,并借助可变长数组ArrayList类的add方法添加,上个步骤遍历过程中,比较大的那个数(它当然来自更大的数组)
package cn.edu.bjut;
import java.util.ArrayList;
public class baiduTest {
public static void main(String[] args) {
// 准备2个整型数组
Integer[] array1 = {1, 2, 3, 4, 5, 6, 16, 27, 29, 25};
Integer[] array2 = {8, 9, 11, 14};
// 求取最大值
Integer a1 = new Integer(0);
int i;
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] >= a1) {
a1 = array1[i];
}
}
// 求取最大值
Integer a2 = new Integer(0);
int j;
for (j = 0; j < array2.length; j++) {
//把比较大的值付给容器
if (array2[j] >= a2) {
a2 = array2[j];
}
}
//使用可变长数组的add方法
ArrayList list = new ArrayList();
if (a1 >= a2) {
//分类讨论情况1
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] >= a2) {
list.add(array1[i]);
}
}
} else {
//分类讨论情况2
for (i = 0; i < array2.length; i++) {
//把比较大的值付给容器
if (array2[i] >= a1) {
list.add(array2[i]);
}
}
}
System.out.println(list);
}
}
水平就不要吐槽我了,此处是为了引出改进优化。当前程序的写法,可读性强,但是比较啰嗦。
遍历数组的过程,在本代码段里重复了4次,其实可以封装成一个成员方法。
并且在第三步骤分类讨论时候,可以先排除a1=a2的边界值情况,直接返回一个空数组或者提示信息,减少时间开销。
Java条件语句之多重 if
package cn.edu.bjut;
import java.util.ArrayList;
/**
* 日期:2020年12月31日
* array1={1,2,3,4,5,6}
* array2={2,3,4}
* answer={5,6}
* 版本:V2
*/
public class baiduTest1 {
public static void main(String[] args) {
// 准备2个整型数组
Integer[] array1 = {1, 2, 3, 4, 5, 6, 16, 27, 29, 25};
Integer[] array2 = {8, 9, 11, 14, 29};
// 求取最大值
Integer a1 = new Integer(0);
int i;
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] > a1) {
a1 = array1[i];
}
}
// 求取最大值
Integer a2 = new Integer(0);
int j;
for (j = 0; j < array2.length; j++) {
//把比较大的值付给容器
if (array2[j] > a2) {
a2 = array2[j];
}
}
//使用可变长数组的add方法
ArrayList list = new ArrayList();
if (a1.equals(a2)) {
//分类讨论情况3
System.out.println("两个数组的MAX值一样哦");
} else if (a1 > a2) {
// a1 > a2
//分类讨论情况1
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] > a2) {
list.add(array1[i]);
}
}
} else {
//a2 > a1
//分类讨论情况2
for (i = 0; i < array2.length; i++) {
//把比较大的值付给容器
if (array2[i] > a1) {
list.add(array2[i]);
}
}
}
System.out.println(list);
}
}
相比于版本V1的代码段,现在层次更清晰,运算更快。使用了java的【.equals()】方法,显得更高级。
这段代码还有继续优化的空间,比如在作遍历比较的存储最大值的变量,可以直接使用array[0]这样赋值即可。
package cn.edu.bjut;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 日期:2020年12月31日
* array1={1,2,3,4,5,6}
* array2={2,3,4}
* answer={5,6}
* 版本:V3
*/
public class baiduTest2 {
public static void main(String[] args) {
// 准备2个整型数组
Integer[] array1 = {1, 2, 3, 4, 5, 6, 16, 27, 29, 25};
Integer[] array2 = {8, 9, 11, 14, 29};
// 把整型数组转换成list集合
List<Integer> list1 =new ArrayList<Integer>();
List<Integer> list2 =new ArrayList<Integer>();
if(array1!=null && array2!=null){
// 调用Arrays.asList()方法把数组转换成线性集合
list1 = Arrays.asList(array1);
list2 = Arrays.asList(array1);
}
// 求取最大值
Integer a1 = array1[0];
int i;
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] > a1) {
a1 = array1[i];
}
}
// 求取最大值
Integer a2 = array2[0];
int j;
for (j = 0; j < array2.length; j++) {
//把比较大的值付给容器
if (array2[j] > a2) {
a2 = array2[j];
}
}
//使用可变长数组的add方法
ArrayList list = new ArrayList();
if (a1.equals(a2)) {
//分类讨论情况3
System.out.println("两个数组的MAX值一样哦");
} else if (a1 > a2) {
// a1 > a2
//分类讨论情况1
for (i = 0; i < array1.length; i++) {
//把比较大的值付给容器
if (array1[i] > a2) {
list.add(array1[i]);
}
}
} else {
//a2 > a1
//分类讨论情况2
for (i = 0; i < array2.length; i++) {
//把比较大的值付给容器
if (array2[i] > a1) {
list.add(array2[i]);
}
}
}
System.out.println(list);
}
}