leetcode上面的一个题目,求Largest Number

  原题如下:

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

  For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

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

  leetcode原链接

  思路1:

  观察两个数的占位规则,可以得到如下规律:

  左边的数比右边的数靠前,上边的数比下边的数靠前

 
99=9 98 97 96 95 94 93 92 91 90
89 88=8 87 86 85 84 83 82 81 80
……
29 28 27 26 25 24 23 22=2 21 20
19 18 17 16 15 14 13 12 11=1 10

  于是可能有这样一种方案:

  1.首先求每个数的最高位,首先依照上表中的列顺序可以直接得出占位顺序;

  2.对于最高位相同的情况:

    (1)如果两数位数相同,直接比较大小即可得出结论;

    (2)而对于两数位数不同的情况,那么我起初是利用上表中对角线的性质,在较短数的后面补位,直接添加最高位数值,如“1234”和“123”则在“123”末尾添“1”,那么最就得到1234>1231,但依此实现之后,提交测试有例外出现,如“121”和“12”补齐之后将出现121=121,但实际情况是12占位应在121之前,除此之外还有98和989,989占位应该在98之前,因此不可一概而论。

    (3)所以,我猜想补齐时应该直接对两数都进行补齐,如“12”和“121”,应该补为“121212”和“121121”,而“989”和“98”应补为“989989”和“989898”,可以得到符合要求的排列。

  上述思路实现时需要使用对数函数,对求得指数取最小公倍数然后进行补齐。

  思路2

  1.首先求与每个数等长的10的整数次方幂。

  2.根据每个数的整数次方幂将两个数组合,如a和b,如果ab>ba,那么a>b,反之b>a。

  上述思路实现如下:

  

  class Solution{
  public:
  string largestNumber(vector<int> &num) {
  string rst;
  std::stringstream out;
  int zero=0;
  for(vector<int>::iterator iter=num.begin();iter!=num.end();++iter)
  if(*iter==0) ++zero;
  for(vector<int>::iterator iter=num.begin();iter!=num.end();++iter)
  {
    vector<int>::iterator max=iter;
    for(vector<int>::iterator tempiter=iter+1;tempiter!=num.end();++tempiter)
    if(!compare1(*max,*tempiter))

      max=tempiter;
    int temp=*iter;
    *iter=*max;
    *max=temp;
    out<<*iter;
   }
  out>>rst;
  if(zero==num.size())
    return "0";
  else
    return rst;
  }
  bool compare1(int int1,int int2)
  {
    int num1=1,num2=1;
    int rm1,rm2;
    rm1=int1/num1;
    rm2=int2/num2;
    while(rm1>9||rm2>9)
    {
      if(rm1>9)
      {
        num1*=10;
        rm1=int1/num1;
      }
      if(rm2>9)
      {
        num2*=10;
        rm2=int2/num2;
      }
    }
    int t1,t2;
    t1=int1*num2*10+int2;
    t2=int2*num1*10+int1;
    if(t1>=t2)

      return true;
    else

      return false;
   }

};

  其他需要注意的地方:

  1.在类似思路1表格分析时,忽略了0的情况,即所有数都是0的情况

  2.使用简单选择排序时,需要考虑0,9,8,7……的特殊情况

  3.程序设计时,良好的测试素质很重要

2015-01-18

时间: 2024-10-19 22:46:27

leetcode上面的一个题目,求Largest Number的相关文章

php通过cURL下载网络上面的一个HTTPS的资源

<?php /** * php通过cURL下载网络上面的一个HTTPS的资源 * 案例:从google的CDN上下载jquery- v1.7.1 */ $curlobj = curl_init(); // 初始化 curl_setopt($curlobj, CURLOPT_URL, "https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js");// 设置访问网页的URL curl_setopt($curlo

[每日编程]求 largest Number - 给出一组非负整数,求这些非负整数可以拼接出的最大数字

英文:Given a list of non negative integers, arrange them such that they form the largest number. 中文:给出一组非负整数,求这些非负整数可以拼接出的最大数字 说明:例如,给出数组 [3, 30, 34, 5, 9],拼接出的最大数字为9534330 正确的排序方法,是使用排序方法进行比较时,比较两个字符串(设为A和B),以先后顺序拼接而成的两个字符串A+B和B+A,如果A+B更大,则A在前B在后,否则A在

LeetCode:Largest Number

1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetcode.com/problems/largest-number/ 3.题目内容 英文:Given a list of non negative integers, arrange them such that they form the largest number. 中文:给出一组非负整数,求这些非负整数可以拼接出的最大数字 说明:例如,给出数组 [3, 30, 34,

【LeetCode】【Python题解】Single Number &amp; Maximum Depth of Binary Tree

今天做了三道LeetCode上的简单题目,每道题都是用c++和Python两种语言写的,因为c++版的代码网上比较多,所以就只分享一下Python的代码吧,刚学完Python的基本语法,做做LeetCode的题目还是不错的,对以后找工作面试也有帮助! 刚开始就从AC率最高的入手吧! 1.Given an array of integers, every element appears twice except for one. Find that single one. Note: Your a

关于leetcode上两数之和的思考

今天在leetcode上完成这道题目时: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 初步代码为 1 class Solution { 2 public int[] t

LeetCode[Sort]: Largest Number

LeetCode[Sort]: Largest Number Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to

动态规划第五讲——leetcode上的题目动态规划汇总(上)

本节,我们将对leetcode上有关DP问题的题目做一个汇总和分析. 1.题目来源 Interleaving String 动态规划 二叉树 Unique Binary Search Trees 动态规划 二叉树 Word Break 动态规划 N/A Word Break II 动态规划 N/A Palindrome Partitioning 动态规划 N/A Palindrome Partitioning II 动态规划 N/A Triangle 动态规划 N/A Distinct Subs

Java 特定规则排序-LeetCode 179 Largest Number

Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to return a string instead of an i

【LeetCode】Largest Number 解题报告

[题目] Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to return a string instead of