2021-09-09:企鹅厂活动发文化衫,文化衫有很多种,企鹅们都穿文化衫。采访中,企鹅会说还有多少企鹅跟他穿一种文化衫。有些企鹅没被采访到,将这些回答放在answers数组里,返回活动中企鹅的最少数量。

福大大 答案2021-09-09:

排序。假设数字x有count个。(x+count)/(x+1)(x+1),这是数字x计算后的人数。对不同x计算后的人数求和,就是需要的返回值。
比如[1,1,1,2,2,2,2],(1+3)/2
2=4,(2+4)/3*3=6。4+6=10就是需要的返回值。
时间复杂度:排序的。
空间复杂度:排序的。
如果数组本身有序:
时间复杂度:O(N)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "sort"
)

func main() {
    arr := []int{1, 1, 1, 2, 2, 2, 2}
    ret := numRabbits(arr)
    fmt.Println(ret)
}

//  三道题如下:
//  微信面试题
//  题目一:
//  股民小 A 有一天穿越回到了 n 天前,他能记住某只股票连续 n 天的价格;他手上有足够多的启动资金,他可以在这 n 天内多次交易,但是有个限制
//  如果已经购买了一个股票,在卖出它之前就不能再继续购买股票了。
//  到 n 天之后,小 A 不能再持有股票。
//  求问 这 n 天内,小 A 能够获得的利润的最大值
//  如果不需要手续费的话,求最大的利润
//  function(number) {
//  return number
//  }
//  输入: prices = [3, 1, 2, 8, 5, 9]
//  输出: 11
//
//  题目二:
//  企鹅厂每年都会发文化衫,文化衫有很多种,厂庆的时候,企鹅们都需要穿文化衫来拍照
//  一次采访中,记者随机遇到的企鹅,企鹅会告诉记者还有多少企鹅跟他穿一种文化衫
//  我们将这些回答放在 answers 数组里,返回鹅厂中企鹅的最少数量。
//  输入: answers = [1]    输出:2
//  输入: answers = [1, 1, 2]    输出:5
//  Leetcode题目:https://leetcode.com/problems/rabbits-in-forest/
//
//  题目三:
//  WXG 的秘书有一堆的文件袋,现在秘书需要把文件袋嵌套收纳起来。请你帮他计算下,最大嵌套数量。
//  给你一个二维整数数组 folders ,其中 folders[i] = [wi, hi] ,表示第 i 个文件袋的宽度和长度
//  当某一个文件袋的宽度和长度都比这个另外一个文件袋大的时候,前者就能把后者装起来,称之为一组文件袋。
//  请计算,最大的一组文件袋的数量是多少。
//  实例
//  输入:[[6,10],[11,14],[6,1],[16,14],[13,2]]
//  输出: 3

// 题目一,股票系列专题,大厂刷题班15节
// 题目三,最长递增子序列专题,大厂刷题班第9节
// 我们来讲一下题目二
func numRabbits(arr []int) int {
    if len(arr) == 0 {
        return 0
    }
    sort.Ints(arr)
    x := arr[0]
    c := 1
    ans := 0
    for i := 1; i < len(arr); i++ {
        if x != arr[i] {
            ans += ((c + x) / (x + 1)) * (x + 1)
            x = arr[i]
            c = 1
        } else {
            c++
        }
    }
    return ans + ((c+x)/(x+1))*(x+1)
}

执行结果如下:
在这里插入图片描述


左神java代码