一、最大乘积问题
题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
输入共2行,第一行包括一个整数n,表示数组长度。第二行为n个以空格隔开的整数,分别为A1,A2, … ,An
输出描述:
满足条件的最大乘积
示例1
输入
4
3 4 1 2
输出
24
思路:
本问题即找到一个已知数组的三个最大值。延伸一下,也就是说找到数组的最大值,以及两个次大值或者两个最小值。因为两个负数之积为正数。
问题解决
1、java机试的输入输出问题
我之前用的输入流为Scanner函数。后来更改为了BufferedReader函数。需要注意它们的区别:
(1)Scanner函数获得输入数据的依据是Space键、Enter键、以及Tab键。而题目中第二行给的数组数据是以空格键隔开,所以该函数不能使用。
(2)BufferedReader函数通过Enter键获得输入数据,其中Enter键不计入数据。所以这个函数的数据我们能通过readLine方法获得。
注意:在使用BufferedReader函数时要处理IOException异常,除了声明该异常以外,在对应方法的方法名字后也应该throw出来。
2、数据类型以及运算超出范围的问题。
要注意到在max1,max2,max3,min1,min2找到后,他们的运算可能会超出int类型的预算范围。所以在return之前要把他们的预算结果强制转换为long类型。
未解决问题或者疑惑
在写这篇博客的时候我有一个新问题:如果出现数字零呢?
已经想清楚了!!!存在零的数据一定小于等于或者大于等于另一组数据。(都存在零,或者只有一组存在)
二、大整数乘法
题目描述
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
示例1
输入
72106547548473106236 982161082972751393
输出
70820244829634538040848656466105986748
思路:
我在网上看到的解决方案有一些是使用分治法,但是我还没有复习到,所以我使用的是另一种方法。方法解析如下图:
我们可以将两个大整数分解成为两个int数组,每个下标里存放一位数(从下标0开始为个位数)。然后利用两重循环将数字两两相乘,按照下标将积存放在二位数组中(比如A0与B9的积存放在数组Array[0][9]中,A6与B8的积存放在数组Array[6][14]中),最后积的存放结果如同笔算的梯形。然后将梯形(二维数组)里面存放的数据按列相加,得到的数组每个里面存放的数字不仅仅是一位数,然后按照上图中的加法原则相加。具体实现如下面代码所示:
public static String dealAdd(int[] nums) {
String ans = (nums[0] % 10)+"";
int mark = 0;
for (int i = 1; i < nums.length; i++) {
int a = (nums[i] % 10) + (nums[i - 1]