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 := []int{1, 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形式返回。 来自去哪儿网。的更多相关文章

  1. 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。

    题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...

  2. 请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件。

    请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件. <a href=”mailto: zhangsan@d-heaven.com”>发邮件</ ...

  3. 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字

    思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...

  4. 【2021/12/31】uniapp之安卓原生插件开发教程

    uniapp之安卓原生插件开发教程 准备 hbuilderX,下载 app离线SDK,下载 Andorid Studio,安卓官方或中文社区 证书(可以自己准备,也可以使用android Studio ...

  5. 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. 如何用cufflinks 拼出一个理想的注释文件

    后记: cufflinks安装: 下载安装包, 不要下载source code ,直接下载binary.    Source code    Linux x86_64 binary http://cu ...

  7. 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置

    一.Action名称的搜索顺序 1.获得请求路径的URI,比如url是:http://server/struts2/path1/path2/path3/test.action 2.首先寻找namesp ...

  8. java当中JDBC当中请给出一个DataSource的单态模式(SingleTon)HelloWorld例子

    [学习笔记] 2.DataSource的单态模式(SingleTon)程序 咱们还接着上面的例子来说.1万个人要看书.千万确保要只建立一个图书馆.要是一不留神,建了两个或三个图书馆,那可就亏大发了.对 ...

  9. java中JDBC当中请给出一个DataSource的HelloWorld例子

    在前面 的jdbc的Helloworld程序当中,我们用DriverManager来获取数据库连接.事实上通过这种方法获取数据库连接,是比较耗费计算机资 源的.当然了,这也是没有办法的事儿.就像我们买 ...

  10. java中请给出一个return this的例子。

    [新手可忽略不影响继续学习]下面例子中setYear中的return this;返回了一个指向对象的指针,this.setMonth(8).setDay(20);是合法的,如果像原来的例子一样什么都不 ...

随机推荐

  1. pandas 某几列转为json/dic 格式

    #%% import pandas as pd df=pd.read_excel('工作表.xlsx') col_list=list(df.columns) del_col_list =['c','d ...

  2. 21206134-赵景涛-第三次blog总结

    一.前言: 本次Blog是对之前发布的PTA题目集的总结性Blog,这几次的作业题量,难度都不大,但都趋近于完成一整个系统,而非只实现部分的功能.题目集九.十也不在给出类图,而是要求自己设计.我认为这 ...

  3. 根据已知经纬度导出对应地点的NDVI值

    首先把经纬度和NDVI投影到同一个坐标上,其次把excel的经纬度到出城shp格式 然后执行如下步骤: [工具][spatial analyst 工具][提取分析][多值提取至点]

  4. Winhex 恢复三个分区

    通过之前的博客WinHex恢复分区,我们知道 在MBR中,一共有四行是我们分区的引导,所以,我们手动只能创建三个主分区,通过工具软件,我们最多可以创建四个主分区 那么测试:如何创建四个主分区? 首先, ...

  5. Linux & 标准C语言学习 <DAY10>

    一.函数递归     函数自己调用自己的行为,叫做函数递归     递归是分治思想的一种具体实现,就是把一个复杂而庞大的问题,分解成若干个相似的小问题,解决所有小问题以解决大问题     如果函数递归 ...

  6. Linux & 标准C语言学习 <DAY9_2>

    一.进程映像     程序:存储在磁盘上的可执行文件(二进制文件.脚本文件)     进程:正在系统中运行的程序     进程映像:进程的内存分布情况         text(代码段):       ...

  7. 树状分级框架UI实例

    树状分级框架UI实例:(内容参考https://zhuanlan.zhihu.com/p/108485875) #coding:utf8 #!/usr/bin/env python #@author: ...

  8. arc145前三题

    为什么只有前三题呢...第四题想了一个小时没思路(主要是半个小时的时候发现看错题了),然后看粉兔博客发现要用Cantor集一类的神奇玩意,手贱看了E题发现还是线性基.于是就run了.NOIP前再学吧 ...

  9. [Python]语音识别媒体中的音频到文本

    @ 目录 准备工作 视频转音频 识别音频到文本 音频直接转换文本 准备工作 安装python3环境 申请一个可用的语音转换API,此篇以Microsoft Azure Speech为例 在Micros ...

  10. java选择结构-switch

    java选择结构-switch java的另一个多选择结构switch-case case中的value为常数值. 不加break,会一直执行到最后,包括default(case穿透) switch( ...