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 := []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
}
}
执行结果如下:

2021-12-31:给定一个arr,里面的数字都是0~9, 你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的,最大的数字,用str形式返回。 来自去哪儿网。的更多相关文章
- 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...
- 请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件。
请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件. <a href=”mailto: zhangsan@d-heaven.com”>发邮件</ ...
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...
- 【2021/12/31】uniapp之安卓原生插件开发教程
uniapp之安卓原生插件开发教程 准备 hbuilderX,下载 app离线SDK,下载 Andorid Studio,安卓官方或中文社区 证书(可以自己准备,也可以使用android Studio ...
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 如何用cufflinks 拼出一个理想的注释文件
后记: cufflinks安装: 下载安装包, 不要下载source code ,直接下载binary. Source code Linux x86_64 binary http://cu ...
- 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置
一.Action名称的搜索顺序 1.获得请求路径的URI,比如url是:http://server/struts2/path1/path2/path3/test.action 2.首先寻找namesp ...
- java当中JDBC当中请给出一个DataSource的单态模式(SingleTon)HelloWorld例子
[学习笔记] 2.DataSource的单态模式(SingleTon)程序 咱们还接着上面的例子来说.1万个人要看书.千万确保要只建立一个图书馆.要是一不留神,建了两个或三个图书馆,那可就亏大发了.对 ...
- java中JDBC当中请给出一个DataSource的HelloWorld例子
在前面 的jdbc的Helloworld程序当中,我们用DriverManager来获取数据库连接.事实上通过这种方法获取数据库连接,是比较耗费计算机资 源的.当然了,这也是没有办法的事儿.就像我们买 ...
- java中请给出一个return this的例子。
[新手可忽略不影响继续学习]下面例子中setYear中的return this;返回了一个指向对象的指针,this.setMonth(8).setDay(20);是合法的,如果像原来的例子一样什么都不 ...
随机推荐
- CentOS7更改阿里源
阿里云yum源:1)备份当前yum源防止出现意外还可以还原回来cd /etc/yum.repos.d/cp /CentOS-Base.repo /CentOS-Base-repo.bak2)使用wge ...
- 12-如何使用Genarator逆向工程
使用逆向工程,帮我们更快的建立pojo类.mapper接口及xml映射文件等,无需手写,替代了一部分的mybatis功能. 一.导入MyGenarator逆向工程项目 二.修改xml配置文件 三.执行 ...
- Map遍历增加key报错如何解决
public static void main(String[] args) throws Exception{ Map<String,Object> aa=new HashMap< ...
- Linux高并发服务器之Linux多线程开发
本文源自C++高薪面试项目的学习笔记,主要记录Liunx多线程的学习,主要知识点是线程概述等基础概念以外,还有线程相关Liunx系统函数以及对应练手代码,除此之外还有线程同步问题的讲解以及实战多线程买 ...
- Linux 用户密码不能设置问题
当我们有时候要更改linux账户密码时,有时候会遇到下面这种情况: Password has been already used. Choose another.passwd: Have exhaus ...
- java中foreach循环用法详解
前言 在前面的文章中,千锋壹哥给大家讲解了for.while.do-while三种循环结构,并讲解了如何跳出循环的几种方式,比如break.continue.return等.但是截止到目前,与循环相关 ...
- IntelliJ IDEA 下载安装及配置使用教程(图文步骤详解)
前言 壹哥在前面的文章中,带大家下载.安装.配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Eclipse中进行项目的创建和代码编写.运行.但是实际上,在各种IDE开发工具中,Ecl ...
- new做了哪些事情,手写一个new
1)创建一个空对象,将构造函数中的this指向这个空对象 2)将空对象的__proto__指向构造函数的prototype原型 3)执行构造函数里面的代码,为这个空对象添加属性和方法 4)返回一个新的 ...
- odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)
计算的字段和变更(Computed Fields And Onchanges) 模型之间的关系是任何Odoo模块的关键组成部分.它们对于任何业务案例的建模都是必要的.然而,我们可能需要给定模型中字段之 ...
- 华为人工智能atlasA800-9000物理服务器离线安装及CANN安装和MindSpore安装和Tensorflow安装
目录 华为人工智能atlas A800-9000 物理服务器全程离线安装驱动以及CANN安装部署和MindSpore安装部署和Tensorflow安装部署 A800-9000 物理服务器安装驱动 使用 ...