LintCode-379.将数组重新排序以构造最小值

将数组重新排序以构造最小值

给定一个整数数组,请将其重新排序,以构造最小值。

注意事项

The result may be very large, so you need to return a string instead of an integer.

样例

给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:
3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323
其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]。

挑战

在原数组上完成,不使用额外空间。

标签

数组

code

class Solution {
public:
    /**
     * @param nums n non-negative integer array
     * @return a string
     */
   
    void transferToString(string &result,int number){  
        if(number<10) {  
            result+=('0'+number);  
            return;  
        }  
        int temp=number;  
        transferToString(result,number/10);  
        result+=('0'+temp);  
    }

    bool compare(int num1,int num2){  
        string com1,com2;

        if(num1==0)  
            com1+=('0'+num1);
        
        while(num1) {  
            com1+=('0'+num1);  
            num1/=10;  
        }   
        if(num2==0)  
            com2+=('0'+num2);
        
        while(num2)  {  
            com2+=('0'+num2);  
            num2/=10;  
        }

        int len1=com1.size(),len2=com2.size();  

        int i,j;  
        for(i=len1-1,j=len2-1;i>=0&&j>=0;i--,j--)  {  
            if(com1[i]>com2[j])  
                return true;  
            else if(com1[i]<com2[j])  
                return false;  
        }  
        if(i==-1&&j==-1)  
            return false;  
        if(i==-1) {  
            while(j>=0) {  
                if(com2[j]<com2[j+1])  
                    return true;  
                else if(com2[j]>com2[j+1])  
                    return false;  
                else  
                    j--;  
            }  
            return false;  
        }  
        else {  
            while(i>=0) {  
                if(com1[i]<com1[i+1])  
                    return false;  
                else if(com2[i]>com2[i+1])  
                    return true;  
                else  
               i--;  
            }  
            return false;  
        }  
    }

    string minNumber(vector<int>& nums) {  
        // Write your code here  
        string result;  
        if(nums.empty())  
            return result;  
        int n=nums.size();
        int i;
        for(i=0;i<n;i++) {  
            for(int j=0;j<n-i-1;j++) {  
                if(compare(nums[j],nums[j+1])) {  
                    int temp=nums[j];  
                    nums[j]=nums[j+1];  
                    nums[j+1]=temp;  
                }  
            }  
              
        }  
        for(i=0;i<nums.size();i++) {
            if(result.empty()&&nums[i]==0)  
                continue;  
            else  
                transferToString(result,nums[i]);
        }
        if(result.empty())  
            result+='0';  
        return result;  
    }  
};
posted @ 2017-05-04 16:39  LiBaoquan  阅读(536)  评论(0编辑  收藏  举报