第一题:
分析:
这道题呢,就是让你交换奇偶性相同的两个数字,让最后的值变成最大,解题 的方式有很多, 第一种能想到的就是一个数字一个数字的交换(同奇同偶),再进行比较,但是这种方法的可行性不高并且非常繁琐,稍有不注意就会少一种情况。 第二种方式就是开两个数组,通过求余数的方式,把奇数偶数分别放到不同的数组,把两个数组进行排序,再次遍历原来的数,判断每一位是技术还是偶数,从而从不同的数组中取出相应的大值,进行输出。 第三种就是利用双指针,所谓的双指针就是两层循环,外(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; } };
注释部分运行时间:
没注释部分: