牛客网刷题——斩获offer

简介: 牛客网刷题——斩获offer

@TOC

一、 随机数组

通过对数器生成一个随机长度,随机大小的数组

public static int[] randomArray(int maxLen,int maxValue) {
        int Len = (int)(Math.random() * maxLen);
        int[] arr = new int[Len];
        if(Len > 0) {
            arr[0] = (int)(Math.random() * maxValue);
            for (int i = 1; i < Len; i++) {
                do {
                    arr[i] = (int)(Math.random() * maxValue);
                } while(arr[i] == arr[i-1]);
            }
        }
        return arr;
    }```
    

二、 局部最小值

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],那么arr[0]是局部最小;
如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i] < arr[i-1],又有arr[i] < arr[i + 1],那么arr[i]是局部最小。给定无序数组arr,已知arr中任意两个相邻的数都不相等,只需要返回arr中任意一个局部最小出现的位置即可,如果不存在这个位置就输出-1。
在这里插入图片描述
在这里插入图片描述

import java.util.*;
public class Main{
    public static int oneMinIndex(int[] arr) {
        if(arr == null || arr.length == 0) {
            return -1;
        }
        if(arr.length == 1) {
            return 0;
        }

        if(arr[0] < arr[1]) {
            return 0;
        }
        int N = arr.length;
        if(arr[N-1] < arr[N-2]) {
            return N-1;
        }
        int L = 0;
        int R = N - 1;
        int ans = -1;
        while(L <= R) {
            int mid = (L + R) / 2;
            if(arr[mid] < arr[mid-1] && arr[mid] < arr[mid+1]) {
                ans = mid;
                break;
            }
            if(arr[mid] > arr[mid-1]) {
                R = mid - 1;
                continue;
            }
            if(arr[mid] > arr[mid+1]) {
                L = mid + 1;
                continue;
            }
        }
        return ans;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        while(scanner.hasNextInt())
        {
            for(int i = 0;i < n;i++) {
            arr[i] = scanner.nextInt();
        }
        }
        System.out.println(oneMinIndex(arr));
    }
}

四、 三个数的最大乘积

给定一个长度为 nn 的无序数组 AA ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。
在这里插入图片描述
我们先对数组进行排序,然后就上面两个情况的数的大小,因为数组是升序的,从小到大,最大的两个负数乘积就在数组的最前面,最大的三个正数就在数组的最后面,比较两个数即可。

  1. 没有正数,当然负数越小乘积越大,即排序后数组的最后三个数,零大于负数
  2. 没有负数,数越大乘积越大,即排序后数组的最后三个数
  3. 一个负数,排序后的最后三个数乘积最大
  4. 一个正数,即开头的第一个情况。
public long solve (int[] A) {
        Arrays.sort(A);
        int n = A.length - 1;
        return Math.max((long)A[n]*A[n-1]*A[n-2],(long)A[0]*A[1]*A[n]);
    }

三、 阶乘累加

计算1!+2!+3!……+n!
方法1:暴力求解

public static long f1(int n) {
        long ans = 0;
        for (int i = 1; i <= n; i++) {
            ans += factorial(i);
        }
        return ans;
    }
    public static long factorial(int n){
        long ans = 1;
        for (int i = 1; i <= n; i++) {
            ans *= i;
        }
        return ans;
    }
    public static void main(String[] args) {
        //求阶乘之和
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(f1(n));
    }

方法二:迭代法

public static long f2(int n) {
        long ans = 0;
        long ret = 1;
        for (int i = 1; i <= n; i++) {
            ret *= i;
            ans += ret;
        }
        return ans;
    }
    public static void main(String[] args) {
        //求阶乘之和
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(f2(n));
    }
目录
相关文章
|
机器学习/深度学习 人工智能 搜索推荐
|
机器学习/深度学习
蓝桥杯刷题(一)
蓝桥杯刷题
109 0
|
算法 C++ Python
每日算法系列【LeetCode 825】适龄的朋友
每日算法系列【LeetCode 825】适龄的朋友
leetcode剑指 Offer 专项突击版(051、008、016)
leetcode剑指 Offer 专项突击版(051、008、016)
110 0
leetcode剑指 Offer 专项突击版(23、047、028、036)
leetcode剑指 Offer 专项突击版(23、047、028、036)
105 0
|
人工智能 物联网 BI
牛客月赛62思考和总结
牛牛在幼稚园做义工,幼稚园中共有 nnn 颗树,第 1 天中午时它们的高度分别为:h1,h2,…,hnh_1,h_2,…,h_nh1​,h2​,…,hn​ (单位:厘米)。每一天的晚上每棵树的高度都会增加 aaa 厘米,而牛牛的任务则是在第二天的清晨检查每一颗树的高度,若某颗树的高度超过了 kkk 厘米牛牛就会将它的高度修剪为 bbb 厘米。牛牛想请你帮它计算一下第 mmm 天中午每一颗树的高度。
117 0