首页 > 试题广场 >

牛牛组数

[编程题]牛牛组数
  • 热度指数:213 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

现在有一个长度为n的只包含数字1-9的字符串x,用这n个数字组成k个数。这k个数每个数至少要用字符串x中的一个数字,字符串x中的每个位置的字符要在这k个数中出现一次。求这k个数的和最大是多少。

组成数字的定义如下:

比如n=3的字符串x为“121”

如果k=3,那么组成k个数只有{1,1,2}这一种可能,和只有一种可能为4

如果k=2,那么组成k个数的方案有{11,2},{12,1},{21,1}三种可能,和最大为21+1=22

如果k=1,那么组成k个数的方案有{112},{121},{211}三种可能,和最大为211


示例1

输入

"345",2

输出

"57"

说明

53+4=57,无法得到比57更大的和

示例2

输入

"233333",3

输出

"3338"

说明

3332+3+3=3338,无法得到比3338更大的和

示例3

输入

"111222333444555666777888999",1

输出

"999888777666555444333222111"

说明

无法得到比999888777666555444333222111更大的和


备注:

对于百分之20的数据:

对于百分之50的数据:

对于百分之100的数据:
(注意给的字符串和返回的字符串都不带引号)
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回最大和的字符串
 * @param x string字符串 即题目描述中所给字符串
 * @param k int整型 即题目描述中所给的k
 * @return string字符串
 */
func Maxsumforknumers(x string, k int) string {
	// write code here
	vec := make([]int, 10)
	for i := 0; i < len(x); i++ {
		vec[x[i]-'0'] += 1
	}
	sumb := 0
	j := 0
	for k > 1 {
		if vec[j] > 0 {
			vec[j]--
			k--
			sumb += j
		} else {
            j++
        }
	}
    sumA := getSumA(vec)
    getSum(sumA, sumb)
    if sumA[0] == '0' {
        sumA = sumA[1:]
    }
    return string(sumA)
}
func getSumA(vec []int) []byte {
    str := make([]byte, 1)
    str[0] = '0'
    var j uint8
    j = 9
    for j < 10 {
        for vec[j] > 0 {
            str = append(str, j + '0')
            vec[j]--
        }
        j--
    }
    return str
}
func getSum(sumA []byte, sumb int) {
    k, left := len(sumA) - 1, 0
    for  sumb > 0 || left > 0 {
        tmp := sumA[k]
        sumA[k] = uint8((int(sumA[k] - '0') + (sumb % 10) + left) % 10) + '0'
        left = (int(tmp - '0') + (sumb % 10) + left) / 10
        k--
        sumb /= 10
    }
}
最小的k-1个1位数的和,与剩下数字组成的最大多位数的和的字符串
编辑于 2023-12-23 21:54:23 回复(0)
class Solution:
    def Maxsumforknumers(self , x , k ):
        # write code here
        arr=[int(i) for i in x]
        arr.sort(reverse=-1)
        ans=''
        if k==len(x):
            ans=str(sum(arr))
        else:
            level = len(arr)-k+1
            for i in range(0,level):
                ans+=str(arr[i])
#           ans = ans[:(len(str(sum(arr[level:])))*-1)-1]+str(int(ans[(len(str(sum(arr[level:])))*-1)-1:])+sum(arr[level:]))
            ans = str(int(ans)+ sum(arr[level:]))
        return ans
发表于 2021-03-29 16:50:14 回复(0)

问题信息

难度:
2条回答 1524浏览

热门推荐

通过挑战的用户

查看代码
牛牛组数