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. CentOS7更改阿里源

    阿里云yum源:1)备份当前yum源防止出现意外还可以还原回来cd /etc/yum.repos.d/cp /CentOS-Base.repo /CentOS-Base-repo.bak2)使用wge ...

  2. 12-如何使用Genarator逆向工程

    使用逆向工程,帮我们更快的建立pojo类.mapper接口及xml映射文件等,无需手写,替代了一部分的mybatis功能. 一.导入MyGenarator逆向工程项目 二.修改xml配置文件 三.执行 ...

  3. Map遍历增加key报错如何解决

    public static void main(String[] args) throws Exception{ Map<String,Object> aa=new HashMap< ...

  4. Linux高并发服务器之Linux多线程开发

    本文源自C++高薪面试项目的学习笔记,主要记录Liunx多线程的学习,主要知识点是线程概述等基础概念以外,还有线程相关Liunx系统函数以及对应练手代码,除此之外还有线程同步问题的讲解以及实战多线程买 ...

  5. Linux 用户密码不能设置问题

    当我们有时候要更改linux账户密码时,有时候会遇到下面这种情况: Password has been already used. Choose another.passwd: Have exhaus ...

  6. java中foreach循环用法详解

    前言 在前面的文章中,千锋壹哥给大家讲解了for.while.do-while三种循环结构,并讲解了如何跳出循环的几种方式,比如break.continue.return等.但是截止到目前,与循环相关 ...

  7. IntelliJ IDEA 下载安装及配置使用教程(图文步骤详解)

    前言 壹哥在前面的文章中,带大家下载.安装.配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Eclipse中进行项目的创建和代码编写.运行.但是实际上,在各种IDE开发工具中,Ecl ...

  8. new做了哪些事情,手写一个new

    1)创建一个空对象,将构造函数中的this指向这个空对象 2)将空对象的__proto__指向构造函数的prototype原型 3)执行构造函数里面的代码,为这个空对象添加属性和方法 4)返回一个新的 ...

  9. odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)

    计算的字段和变更(Computed Fields And Onchanges) 模型之间的关系是任何Odoo模块的关键组成部分.它们对于任何业务案例的建模都是必要的.然而,我们可能需要给定模型中字段之 ...

  10. 华为人工智能atlasA800-9000物理服务器离线安装及CANN安装和MindSpore安装和Tensorflow安装

    目录 华为人工智能atlas A800-9000 物理服务器全程离线安装驱动以及CANN安装部署和MindSpore安装部署和Tensorflow安装部署 A800-9000 物理服务器安装驱动 使用 ...