第一题:
分析:
这道题呢,就是让你交换奇偶性相同的两个数字,让最后的值变成最大,解题 的方式有很多,
第一种能想到的就是一个数字一个数字的交换(同奇同偶),再进行比较,但是这种方法的可行性不高并且非常繁琐,稍有不注意就会少一种情况。
第二种方式就是开两个数组,通过求余数的方式,把奇数偶数分别放到不同的数组,把两个数组进行排序,再次遍历原来的数,判断每一位是技术还是偶数,从而从不同的数组中取出相应的大值,进行输出。
第三种就是利用双指针,所谓的双指针就是两层循环,外(i)层从开头开始遍历,内(j)层从末尾开始遍历,如果是同奇同偶,并且在加一个条件,就是下标为i的值要小于下标为j的值,这样就保证了交换后的一定比交换前的数值大。
源码:
解法一:
就不写了,比较麻烦
解法二:
class Solution {
public:
int largestInteger(int num) {
// 1、将奇数和偶数分别存在在两个数组中,然后进行从大到小的排序
vector<int> v1,v2;
string s=to_string(num);
for(char c:s){
int x=c-'0';
if(x&1)v2.push_back(x);
else v1.push_back(x);
}
sort(v1.rbegin(),v1.rend()),sort(v2.rbegin(),v2.rend());
int a=0,b=0;
int res=0;
// 2、重新开始遍历数字,若为偶数则添加偶数数组中数字;若为奇数则添加奇数数组中的数字
for(char c:s){
int x=c-'0';
if(x&1)res=res*10+v2[b++];
else res=res*10+v1[a++];
}
return res;
}
};
解法三:
class Solution {
public:
int largestInteger(int num) {
string ss=to_string(num);
for(int i=0;i<ss.size();i++)
{
for(int j=ss.size();j>i;j--)
{
if((ss[j]-ss[i])%2==0&&ss[i]<ss[j])
{
swap(ss[i],ss[j]);
}
}
}
return stoi(ss);
}
};
第三题:
分析:
这道题呢,通过找规律可以发现,每次加1的那个数一定是数组中最小的那个,所以这道题变得非常简单,只用操作前找到最小的值,最后再进行想乘。注意测试用例可能会很大所以每次都要对10^9+7取余;
源码:
class Solution {
public:
int maximumProduct(vector<int>& nums, int k) {
// for(int i=0;i<k;i++)
// {
// int a=min_element(nums.begin(),nums.end())-
nums.begin();
// nums[a]+=1;
// }
// long long sum=1;
// for(int i=0;i<nums.size();i++)
// {
// sum*=nums[i];
// sum%=1000000007;
// }
priority_queue<int,vector<int>,greater<int>> qw;
for(int i:nums)
{
qw.push(i);
}
for(int i=0;i<k;i++)
{
int n=qw.top();
qw.pop();
qw.push(n+1);
}
long long sum=1;
while(!qw.empty())
{
sum*=qw.top();
qw.pop();
sum%=1000000007;
}
return sum;
}
};
注释部分运行时间:
没注释部分:
最后一次更新于2022-04-10
0 条评论