高精度
题目描述
牛牛现在有一个长度为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更大的和
备注:
对于百分之100的数据:;1≤n≤100000;1≤k≤n; (注意给的字符串和返回的字符串都不带引号)
ac代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回最大和的字符串
* @param x string字符串 即题目描述中所给字符串
* @param k int整型 即题目描述中所给的k
* @return string字符串
*/
string Maxsumforknumers(string x, int k) {
// write code here
//cout<<x.length()<<endl;
int tong[10]={0},a[100005];
for(int i=0;i<x.length();i++){
tong[x[i]-'0']++;
}
int p = 9;
for(int i=x.length()-k;i>=0;i--){
while(tong[p]==0) p--;
a[i] = p;
tong[p]--;
}
for(;p>=0;p--){
a[0] += p*tong[p];
}
for(int i=0;i<=x.length();i++){
a[i+1] += a[i]/10;
a[i] %= 10;
}
/*for(int i = 0;i<x.length()-k+2;i++){
cout<<a[i]<<" ";
}
cout<<"....."<<endl;*/
string s = "";
for(int i=x.length();i>=0;i--){
if(a[i]!=0){
for(int j=i;j>=0;j--){
s += a[j]+'0';
}
break;
}
}
return s;
}
};
代码2
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回最大和的字符串
* @param x string字符串 即题目描述中所给字符串
* @param k int整型 即题目描述中所给的k
* @return string字符串
*/
int a[100005]={0};
int tong[10];
string Maxsumforknumers(string x, int k) {
// write code here
int i;
for(i=0;i<x.length();i++){
tong[x[i]-'0']++;
}
int p=9;
for(i=x.length()-k;i>=0;i--){
while(!tong[p]) p--;
a[i]=p;
tong[p]--;
}
for(;p>0;p--){
a[0] += p*tong[p];
}
for(i=0;i<x.length();i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
for(i=x.length();i>=0;i--) {
if(a[i]!=0)
break;
}
string res="";
for(;i>=0;i--) res += a[i]+'0';
return res;
}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求最小差值
* @param a int整型vector 数组a
* @return int整型
*/
int minDifference(vector<int>& a) {
// write code here
sort(a.begin(),a.end());
//int minn = (1 << 31)-1;
long long c,d,minn = 1e18;
for(int i=0;i<a.size()-1;i++){
//必须要转long long 才能过
//minn = min((long long)minn , (long long)a[i+1]-a[i]);
c = a[i];
d = a[i+1];
minn = min(minn, d-c);
}
return minn;
}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n long长整型 表示标准完全二叉树的结点个数
* @return long长整型
*/
long long tree4(long long n) {
// write code here
int mod = 998244353;
long long i,res=0,dep=1;
for(i=1;i*2<=n;i*=2){
long long sum = (i+2*i-1)*i/2%mod;
res = (res+sum*dep)%mod;
dep++;
}
long long sum = (i+n)*(n-i+1)/2%mod;
res = (res+sum*dep)%mod;
return res;
}
};