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
执行结果如下:
以上是关于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, 每个数字只