• 力扣2578. 最小和分割


    题目描述:

    给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足:

    • num1 和 num2 直接连起来,得到 num 各数位的一个排列。
      • 换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。
    • num1 和 num2 可以包含前导 0 。

    请你返回 num1 和 num2 可以得到的和的 最小 值。

    注意:

    • num 保证没有前导 0 。
    • num1 和 num2 中数位顺序可以与 num 中数位顺序不同。

    示例 1:

    输入:num = 4325
    输出:59
    解释:我们可以将 4325 分割成 num1 = 24 和 num2 = 35 ,和为 59 ,59 是最小和。
    

    示例 2:

    输入:num = 687
    输出:75
    解释:我们可以将 687 分割成 num1 = 68 和 num2 = 7 ,和为最优值 75 。
    

    提示:

    • 10 <= num <= 10^9

    思路:

    这个题很简单,就是把num里面的所有位数全部取出来,然后分给两个数,看怎么组合两个数的和最小。首先,这两个数num1和num2的位数一定相差不能超过1,比如说,如果num是一个四位数,那么num1和num2一定是两个两位数相加,否则就是一个三位数加一个一位数,不利于得到最小和。

    而且,要想num1+num2最小,这两个数的各个位数的排序一定是小的在前面。

    比如说num=1324,那么1和2是最小的两个数,把他们分别反在num1,num2高位,在安排3、4。

    注意这里由于两数相加是相应位数相加,所以对于同一位而言,1+2和2+1没有区别,也就是说13+24与14+23没有区别。

    这样一来,直接将num的各个位数从小到大依次安排在num1和num2的高位就OK。

    代码:

    1. class Solution {
    2. public:
    3. int splitNum(int num) {
    4. vector<int> arr;
    5. int a=0;
    6. int b=0;
    7. while(num){
    8. int k=num%10;
    9. arr.push_back(k);
    10. num/=10;
    11. }
    12. sort(arr.begin(),arr.end());
    13. for(int i=0;isize();i++){
    14. if(i%2==0){
    15. a=a*10+arr[i];
    16. }else{
    17. b=b*10+arr[i];
    18. }
    19. }
    20. return a+b;
    21. }
    22. };

  • 相关阅读:
    从0开始学习pyspark--pyspark中的Spark DataFrame, Spark SQL, Pandas on Spark[第3节]
    机器学习基础:奇异值分解(SVD)
    Android原生实现控件选择背景变色方案(API28及以上)
    【社媒营销】进来了解下Whatsapp Business API?出海群发不用愁!
    计算机二级Python题目13
    C/C++面试题分享
    《工程伦理》1-13章汇总
    Linux 进程调度通知机制
    环保行业智能供应商管理系统精细化管理助推环保企业创新发展
    Docker自定义镜像
  • 原文地址:https://blog.csdn.net/qq_62987647/article/details/133717991