1)题目
实现一个算法在数组中找到 3 个数字的最大乘积。介绍如下:
例如数组 [5, -2, 3, 1, -1, 4] 中 3 个数字的最大乘积为 60。
输入格式:
第一行为数字 N(3≤N≤1000),表示数组元素的个数。
第二行为数组元素 Ai,−1000≤Ai ≤1000。
输出格式:
输出一行,为 3 个数字的最大乘积。
输入样例:
在这里给出一组输入。例如:
6 5 -2 3 1 -1 4输出样例:
在这里给出相应的输出。例如:
60
2)题目解读
题目意思很简单,从输入的N个数中找到乘积最大的三个数。我们可以先对这些数进行排序,然后比较是 最小两个数(可能两个都是负数,负负得正)*最大数大还是 最大三个数的乘积大。
3)代码
import java.util.Arrays; import java.util.Scanner; public class Main{ //7-6 寻找 3 个数的最大乘积 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] arr=new int[n]; for (int i=0;i<arr.length;i++){ arr[i]=sc.nextInt(); } //对输入的数进行排序 Arrays.sort(arr); //比较是 最小两个数(可能两个都是负数,负负得正)*最大数大 // 还是 最大三个数的乘积大。 int max=Math.max(arr[n-1]*arr[0]*arr[1],arr[n-1]*arr[n-2]*arr[n-3]); System.out.println(max); } }
2、拼数
1)题目
设有 n 个正整数a1 …an ,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式:
第一行有一个整数,表示数字个数 n。
第二行有 n 个整数,表示给出的 n 个整数 ai 。
其中,1≤n≤20,1≤ai ≤10^9。
输出格式:
输出一个正整数,表示最大的整数。
输入样例:
在这里给出一组输入。例如:
4 7 13 4 246
输出样例:
在这里给出相应的输出。例如:
7424613
2)题目解读
题目要求我们从n个数字中拼接出一个最大的数字并输出,我们可以实现一个比较器,去进行比较这些数的优先级,然后进行排序。
3)代码
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; //创建num类并实现Comparator接口 class num implements Comparator<String> { //重写compare方法 public int compare(String o1, String o2) { int i=0; while (true){ //如果比较到后面,两个数字前面一直相等,则比较两数字的长度并返回 if (i==o1.length()||i==o2.length()){ return o1.length()-o2.length(); } //如果两个数字的第i为相等则进入下次循环 if (o1.charAt(i)==o2.charAt(i)) { } //如果第i位数字不同则进行比较并返回 else { return o1.charAt(i)-o2.charAt(i); } i++; } } } public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n= Integer.parseInt(sc.nextLine()); String[] s; //把他们当字符串输入,方便后面比较 String ss=sc.nextLine(); s=ss.split(" "); //进行排序,并传入num比较器 Arrays.sort(s,new num()); String ar=s[s.length-1]; for (int i=s.length-2;i>=0;i--){ //进行拼接字符串 ar=ar.concat(s[i]); } System.out.println(ar); } }
3、四平方和
1)题目
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
输入格式:
程序输入为一个正整数N (N<5000000)
输出格式:
要求输出4个非负整数,按从小到大排序,中间用空格分开
输入样例:
在这里给出一组输入。例如:
5
输出样例:
在这里给出相应的输出。例如:
0 0 1 2
2)题目解读
5=0*0+0*0+1*1+2*2
题目说 对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
这个意思就是输出由abcd组成最小的表达式,因此我们直接使用循环去找这最小表达式。
5000000的开根号约等于2237.
3)代码
import java.util.Scanner; public class Main { public static int xx(int a,int b,int c,int d){ int sum= (int) (Math.pow(a,2)+Math.pow(b,2)+Math.pow(c,2)+Math.pow(d,2)); return sum; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); boolean f=true; for (int a=0;a<2237&&f;a++){ for (int b=0;b<100&&f;b++){ if (xx(a,b,0,0)>n) break; for (int c=0;c<2237&&f;c++){ if (xx(a,b,c,0)>n) break; for (int d=0;d<2237&&f;d++){ if (xx(a,b,c,d)>n) break; if (xx(a,b,c,d)==n){ System.out.println(a+" "+b+" "+c+" "+d); f=false; } }}}} } }
以上都是我个人的解题思路,有什么不足或者建议可以评论或者私信,一起交流学习