2021-12-31:给定一个arr,里面的数字都是0~9, 你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的,最大的数字,用str形式返回。 来自去哪儿网。

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-12-31:给定一个arr,里面的数字都是0~9, 你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的,最大的数字,用str形式返回。 来自去哪儿网。相关的知识,希望对你有一定的参考价值。

2021-12-31:给定一个arr,里面的数字都是0~9,
你可以随意使用arr中的数字,哪怕打乱顺序也行,
请拼出一个能被3整除的,最大的数字,用str形式返回。
来自去哪儿网。

答案2021-12-31:

递归。从左往右遍历,要i还是不要i。
贪心的思路解法 :
先得到数组的累加和,记为sum
1 . 如果sum%3 == 0,说明所有数从大到小拼起来就可以了
2 . 如果sum%3 == 1,说明多了一个余数1,
只需要删掉一个最小的数(该数是%3 == 1的数);
如果没有,只需要删掉两个最小的数(这两个数都是%3 == 2的数);
3 . 如果sum%3 == 2,说明多了一个余数2,
只需要删掉一个最小的数(该数是%3 == 2的数);
如果没有,只需要删掉两个最小的数(这两个数都是%3 == 1的数);
如果上面都做不到,说明拼不成。

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

package main

import (
    "fmt"
    "sort"
)

func main() 
    A := []int1, 2, 3, 4, 1
    ret := max3(A)
    fmt.Println(ret)


func max3(A []int) string 
    if len(A) == 0 
        return ""
    
    mod := 0
    arr := make([]int, 0)
    for _, num := range A 
        arr = append(arr, num)
        mod += num
        mod %= 3
    
    if (mod == 1 || mod == 2) && !remove(&arr, mod, 3-mod) 
        return ""
    
    if len(arr) == 0 
        return ""
    
    //arr.sort((a, b) -> b - a);
    sort.Slice(arr, func(i, j int) bool 
        return arr[i] > arr[j]
    )
    if arr[0] == 0 
        return "0"
    
    //StringBuilder builder = new StringBuilder();
    builder := make([]byte, 0)
    for _, num := range arr 
        //builder.append(num);
        builder = append(builder, []byte(fmt.Sprint(num))...)
    
    return string(builder)


// 在arr中,要么删掉最小的一个、且%3之后余数是first的数
// 如果做不到,删掉最小的两个、且%3之后余数是second的数
// 如果能做到返回true,不能做到返回false
func remove(arr *[]int, first, second int) bool 
    if len(*arr) == 0 
        return false
    
    //arr.sort((a, b) -> compare(a, b, first, second));
    sort.Slice(*arr, func(i, j int) bool 
        return compare((*arr)[i], (*arr)[j], first, second) < 0
    )
    size := len(*arr)
    if (*arr)[size-1]%3 == first 
        //arr.remove(size - 1)
        *arr = (*arr)[0 : size-1]
        return true
     else if size > 1 && (*arr)[size-1]%3 == second && (*arr)[size-2]%3 == second 
        //arr.remove(size - 1)
        //arr.remove(size - 2)
        *arr = (*arr)[0 : size-2]
        return true
     else 
        return false
    


// a和b比较:
// 如果余数一样,谁大谁放前面
// 如果余数不一样,余数是0的放最前面、余数是s的放中间、余数是f的放最后
func compare(a, b, f, s int) int 
    ma := a % 3
    mb := b % 3
    if ma == mb 
        return b - a
     else 
        if ma == 0 || mb == 0 
            return twoSelectOne(ma == 0, -1, 1)
         else 
            return twoSelectOne(ma == s, -1, 1)
        
    


func twoSelectOne(c bool, a, b int) int 
    if c 
        return a
     else 
        return b
    

执行结果如下:


左神java代码

以上是关于2021-12-31:给定一个arr,里面的数字都是0~9, 你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的,最大的数字,用str形式返回。 来自去哪儿网。的主要内容,如果未能解决你的问题,请参考以下文章

2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。

2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有

2022-06-04:给定一个数字n,表示一开始有编号1~n的树木,列成一条直线, 给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围, 给定一个数字m,表示你可以补种多

给定一个排好序的数组,然后求出丢失的数字

2021-08-21:给定一个数组arr,长度为N > 1,从中间切一刀,保证左部分和右部分都有数字,一共有N-1种切法,如此多的切法中,每一种都有:绝对值(左部分最大值 – 右部分最大值)。返回最大

2022-05-02:给定一个数组arr,一个正数num,一个正数k, 可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num, 且该组数字的个数一定要正好等于k, 每个数字只