第288场leetCode周赛总结

第一题:按奇偶性交换后的最大数字
我看到这个题目一开始就有两种思路。一是将整数转化为字符串后将奇偶数分成两个数组,标记原字符串中的奇偶数位置,然后对两个数组排序。最后直接根据标记从数组中取出奇偶数组合即可。嗯,好笑的来了,我并不能写出代码。第二种思路就是转化为字符串后使用冒泡排序(刚知道这不是冒泡排序),然后再转化为整数。我也是这样写了,但是最后为什么没有通过呢,因为我把排序写错了,然后直接还没有发现。看看我写的错误代码吧:
(其实一开始在整数转字符串和字符串转整数我都用的函数,可能是因为用法不对报错了,我就自己手写了。)

class Solution {
public:
    int largestInteger(int num) {
        vector<int>s;
        while(num>0){
        s.push_back(num%10);
        num=num/10;
        }
        for(int i=0;i<s.size()-1;i++){
            for(int j=1;j<s.size();j++){
                if(s[i]<s[j]&&s[i]%2==s[j]%2){
                    swap(s[i],s[j]);
                }
            }
        }
        int result=0;
        for(int i=0;i<s.size();i++){
            result=result*10+s[i]-'0';
        }
        
        return result;
    }
};

啊啊啊啊,我真无语。
然后看看正确代码叭

class Solution {
public:
    int largestInteger(int num) {
        string nums=to_string(num);
        int n=nums.size();
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(nums[i]<nums[j]&&(nums[j]-nums[i])%2==0)
                swap(nums[i],nums[j]);
            }
        }
        return stoi(nums);
    }
};

然后我觉得nums[i]<nums[j]&&(nums[j]-nums[i])%2==0这里处理的挺巧妙的,因为我一开始没有想到哈哈哈哈哈。

第二题:向表达式添加括号后的最小结果
这个题一开始能想到的思路就是枚举。但是实现起来有点麻烦所以也没有写出来。后来看别人的题解,感觉题目还是很简单的,真就是处理起来比较麻烦,所以对于我这种来说一开始会决定难!这个题目分三步:
1、将字符串加号前后的字符分为两个子串。
2、找出所有可以加括号的情况并记录括号的位置

int result=INT_MAX;
        int startindex=0;
        int endindex=0;
        for(int i=0;i<s1.size();i++){
            int num1=1,num4=1;
            for(int j=s2.size()-1;j>=0;j--){
                if(i!=0)num1=atoi(s1.substr(0,i).c_str());
               int  num2=atoi(s1.substr(i,s1.size()).c_str());
                int num3=atoi(s2.substr(0,j+1).c_str());
                if(j!=s2.size()-1)num4=atoi(s2.substr(j+1,s2.size()).c_str());
                int count=num1*(num2+num3)*num4;
                if(result>count){
                    startindex=i;
                    endindex=j;
                    result=count;
                }
            }
        }在这里插入代码片

3、在上面记录的最终位置添加括号。
参考代码:

class Solution {
public:
    string minimizeResult(string expression) {
        int a=0;
        for(int i=0;i<expression.size();i++){
            if(expression[i]=='+')
            a=i;
        }
        string s1=expression.substr(0,a);
        string s2=expression.substr(a+1,expression.size()-1);
        int result=INT_MAX;
        int startindex=0;
        int endindex=0;
        for(int i=0;i<s1.size();i++){
            int num1=1,num4=1;
            for(int j=s2.size()-1;j>=0;j--){
                if(i!=0)num1=atoi(s1.substr(0,i).c_str());
               int  num2=atoi(s1.substr(i,s1.size()).c_str());
                int num3=atoi(s2.substr(0,j+1).c_str());
                if(j!=s2.size()-1)num4=atoi(s2.substr(j+1,s2.size()).c_str());
                int count=num1*(num2+num3)*num4;
                if(result>count){
                    startindex=i;
                    endindex=j;
                    result=count;
                }
            }
        }
        expression=expression.insert(startindex,"(");
        expression=expression.insert(endindex+s1.size()+3,")");
        return expression;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值