【剑指offer】把数组排成最小值

本文探讨了如何将数组中的数字拼接成最小可能的数值,通过比较不同的算法实现,包括手动实现和更简洁优雅的方法。介绍了使用C++11中的to_string函数,并提供了一种基于字符串比较的排序算法来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
题意:数组中的数字拼接为最小数值
比如:2,3,321,32,323
拼接结果为:2321323233
个人用的很麻烦的,纯粹手动实现算法,现在有更漂亮的代码!
我的思路是:
初始化:记住每个数值的长度,将所有数字都生成相同长度的数值,循环式生成,比如上例,2生成222,3生成333,,32生成323,即拼到最长数值长度(3),规则为循环式生成!
排序:然后将生成的所有数字排序,为了排序后,长度记录不变,采用了结构体。
拼接:按照之前的长度进行拼接。
C++11中的to_string是神奇的操作!

// 我的代码
#include<bits/stdc++.h>
using namespace std;
struct number{
    int value;
    int num;
    bool operator < (const number &t) const{
        if(t.value == value)
            return t.num > num;
        return t.value > value;
    }
};
class Solution {
public:
    int numb(int t){
        int num = 0;
        while(t){
            t /= 10;
            num += 1;
        }
        return num;
    }
    string PrintMinNumber(vector<int> numbers) {
        number a[10010];
        int maxn = 0;
        
        for(int i = 0; i < numbers.size(); i++){
            a[i].num = numb(numbers[i]);            
            maxn = max(a[i].num,maxn);
            a[i].value = numbers[i];
            cout<<a[i].num<<endl;
        }
        cout<<maxn<<endl;
        for(int i = 0;i < numbers.size(); i++){
            int m = numbers[i];
            int t = numbers[i];
            if(maxn - a[i].num > 0){
                int k = a[i].num - 1;
                for(int j = 0;j < maxn - a[i].num; j++){
                    if(m == 0)
                        m = t;
                    if(k == -1)
                        k = a[i].num - 1;
                    cout<<"--"<<m<<"--"<<endl;                    
                    int po = pow(10,k);
                    cout<<"--"<<po<<endl;              
                    numbers[i] = numbers[i] * 10 + m / po;
                    k --;
                    m = m % po;
                    cout<<numbers[i]<<"--"<<po<<"--"<<m<<endl;
                }
                a[i].value = numbers[i];
                cout<<numbers[i]<<endl;
            }
        }
        sort(a,a+numbers.size());
        string str;
        str.clear();
        for(int i = 0;i < numbers.size(); i++){
            int po = pow(10,maxn - a[i].num);
            string st = to_string(a[i].value/po);
            str.append(st);
        }
        return str;
    }
};
int main(){
    Solution so;
    vector<int> v;
    v.push_back(3);
    v.push_back(323);
    v.push_back(2);
    v.push_back(321);
    v.push_back(32);
    cout<<so.PrintMinNumber(v);
}

迷人的代码!!!

class Solution {
 public:
     static bool cmp(int a,int b){
         string A="";
         string B="";
         A+=to_string(a);
         A+=to_string(b);
         B+=to_string(b);
         B+=to_string(a);
          
         return A<B;
     }
     string PrintMinNumber(vector<int> numbers) {
         string  answer="";
         sort(numbers.begin(),numbers.end(),cmp);
         for(int i=0;i<numbers.size();i++){
             answer+=to_string(numbers[i]);
         }
         return answer;
     }
 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值