zoukankan      html  css  js  c++  java
  • 179. Largest Number

    Problem:

    Given a list of non negative integers, arrange them such that they form the largest number.

    Example 1:

    Input: [10,2]
    Output: "210"
    

    Example 2:

    Input: [3,30,34,5,9]
    Output: "9534330"
    

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

    思路

    Solution (C++):

    string largestNumber(vector<int>& nums) {
            if (nums.empty())  return "";
        int n = nums.size();
        string ans = "";
        bool flag = false;
        for (int i = 0; i < n; ++i) {
            if (nums[i]) { flag = true; break; }
        }
        shell_sort(nums);
        if (flag) {
            for (int i = n-1; i >= 0; --i) {
                ans += to_string(nums[i]);
            }            
        } else return "0";
    
        return ans;
    }
    int max_bit(int x) {
        int count = 0;
        if (x == 0)  return 1;
        while (x) {
            count++;
            x /= 10;
        }
        return count;
    }
    bool is_bigger(int x, int y) {
        int x_bit = max_bit(x), y_bit = max_bit(y);
        if (x_bit == y_bit)  return x >= y;
        vector<int> v1 = get_bit(x), v2 = get_bit(y);
        for (auto x : v2)  v1.push_back(x);
        for (auto x : v1)  v2.push_back(x);
        int n = v1.size();
        for (int i = 0; i < n; ++i) {
            if (v1[i] > v2[i])  return true;
            if (v1[i] < v2[i])  return false;
        }
        return true;
    }
    vector<int> get_bit(int x) {
        vector<int> v;
        if (x == 0)  v.push_back(x);
        while (x) {
            v.push_back(x%10);
            x /= 10;
        }
        for (int i = 0; i < v.size()/2; ++i) {
            swap(v[i], v[v.size()-1-i]);
        }
        return v;
    }
    void shell_sort(vector<int>& v) {
        int h = 1, n = v.size();
        while (h < n / 3) {
            h = 3 * h + 1;
        }
        while (h >= 1) {
            for (int i = h; i < n; ++i) {
                for (int j = i; j >= h && !is_bigger(v[j], v[j-h]); j -= h) {
                    swap(v[j], v[j-h]);
                }
            }
            h /= 3;
        }
    }
    

    性能

    Runtime: 12 ms  Memory Usage: 7.8 MB

    思路

    Solution (C++):

    
    

    性能

    Runtime: ms  Memory Usage: MB

    相关链接如下:

    知乎:littledy

    欢迎关注个人微信公众号:小邓杂谈,扫描下方二维码即可

    作者:littledy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    强大的C#图形处理组件
    Spring整合Mybatis的注意事项
    Umbraco常见陷阱与错误模式
    Umbraco 官网阅读理解
    Umbraco模型默认属性
    无缝隙滚动跑马灯组件
    这才是正确删除 office 的方式
    SVN利用Hooks自动发布网站
    Umbraco安装权限问题
    EPiServer网文
  • 原文地址:https://www.cnblogs.com/dysjtu1995/p/12634610.html
Copyright © 2011-2022 走看看