刷题之寻找 3 个数的最大乘积和拼数及四平方和

简介: 刷题之寻找 3 个数的最大乘积和拼数及四平方和

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;
                        }
                    }}}}
    }
}

以上都是我个人的解题思路,有什么不足或者建议可以评论或者私信,一起交流学习


目录
相关文章
|
7月前
|
算法 测试技术 C#
【单调队列】LeetCode1499:满足不等式的最大值
【单调队列】LeetCode1499:满足不等式的最大值
|
7月前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
54 1
|
7月前
|
C++ Java Go
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
54 0
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
|
7月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
103 0
|
算法 测试技术 C#
C++二分算法的应用:乘法表中第k小的数
C++二分算法的应用:乘法表中第k小的数
每日一题——乘积小于 K 的子数组
每日一题——乘积小于 K 的子数组
80 0
每日一题——乘积小于 K 的子数组
|
算法 C++
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。
348 0
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
LeetCode 633. 平方数之和(双指针法)
LeetCode 633. 平方数之和(双指针法)
98 0
LeetCode每日一题——713. 乘积小于 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
122 0
|
测试技术
LeetCode每日一题——795. 区间子数组个数
给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。
146 0