面试算法:Maxbuild

题目:给定一个整数数组,要求放回最大值的组合字符串.

例如 12, 345, 6789. 返回678934512

第一印象想用动态规划,后来觉得不太合适,穷举组合:

123456789

126789345

345126789

345678912

678912345

678934512

一共有N!种组合,时间复杂度也是N!。

换一种思路,用排序,快排的话时间复杂度为nlogn,空间复杂度为n,但注意的是不应该按整形值的大小来排序

例如:554,55,5. 返回555554.

556,55,5. 返回556555.

所以在快速排序的基础上比较方法要做一些处理。

bool Comp(string A, string B)
{
    if(A.length == B.length)
    return int(A) > int(B);

    int i = 0;
    while(i<A.length&&i<B.length)
    {
        if(A[i]>B[i]) return true;
        else if(A[i]<B[i]) return false;
        i++;
    }
    if(A.length>i)
    {
       if(A[i]>B[0]) return true;
       else return false;
    }
    else
    {
       if(B[i]>A[0]) return false;
       else return true;
     }
}

好了,我们来写快速排序函数吧,先构造一个单遍排序函数Piv

int Piv(ref Uint[] L, int low, int high)
{
    int p = L[low];
    while(low<high)
    {
       while(low<high&&Comp(L[high].tostring(),p.tostring())) high --;
       L[low]=L[high];
       while(low<high&&Comp(p.tostring(), L[low].tostring())) low++;
       L[high]=L[low];
     }
     L[low] = p;     reutnr low;
}

在写一个递归函数来执行多遍遍历Qsort

void Qsort(ref Uint[] L, int low, int high)
{
    if(low < high)
    {
      int p = Piv(L,low,high);
      Qsort(L,low,p-1);
      Qsort(L,p+1,high);
    }
}

最后一个调用Maxbuild

string Maxbuild(Uint L)
{
    Qsort(L,0,L.length-1);
    Buildstring MaxString = new Buildstring();
    L.each(a => Maxstring.app(a.tostring()));
    return MaxString;
}

题目出处:https://leetcode.com/problems/largest-number/

AC的代码

class Solution {
public:
    string largestNumber(vector<int> &num) {
        if(num.size()<1) return "0";
        string largestString;
        vector<string> numstr;
        for(int i=0;i<num.size();i++)
        {
            string a=intToString(num[i]);
            numstr.push_back(a);
    for(int j =numstr.size()-1;j>0;j--)
    {
        string aa=numstr[j-1]+numstr[j];
        string bb=numstr[j]+numstr[j-1];
        if(aa.compare(bb)<0){
            string b=numstr[j-1];
            numstr[j-1]=numstr[j];
            numstr[j]=b;
        }
        }}
        if(numstr[0]=="0")return "0";
        for(int i=0;i<numstr.size();i++)
        {
            largestString+=numstr[i];
        }
        return largestString;
    }
    string intToString(int a)
    {
        if(a<=0)return "0";
        string astr;
        while(a!=0)
        {
            astr=char(a%10+‘0‘)+astr;
            a/=10;
        }
        return astr;
    }
};

  

时间: 2024-10-01 00:47:06

面试算法:Maxbuild的相关文章

BAT面试算法精品课直通BAT面试算法精品课购买优惠码-牛客网

BAT面试算法精品课,直通BAT面试算法精品课. 大家可以先看试看的内容,视频短小精悍,切中解题的要害.既快速掌握核心知识又能节约复习时间. 反正我是不喜欢拖拖拉拉,长篇大论的视频课程. 况且知识面涵盖的比较广,适合找工作复习用. 第一次购买课程,觉得价格也能接受. 如果你也对这门课感兴趣,可以使用以下优惠码,还能优惠10元 优惠码:Axn54dY 或直接打开链接 http://www.nowcoder.com/courses/1?coupon=Axn54dY

面试算法:利用堆栈计算逆向波兰表达式

更详细的讲解和代码调试演示过程,请参看视频 如何进入google,算法面试技能全面提升指南 给定一个四则运算表达式的字符串,如果该表达式满足逆向波兰表达式,那么该字符串要满足以下条件: 1: 该表达式含有一个数字字符或一串数字字符. 2:它拥有给定格式,如"A, B, .",其中A,B是逆向波兰表达式,句号.表示的是四种运算符"+,-,*,/"其中之一. 例如字符串"3,4,*,1,2,+,+"就满足逆向波兰表达式,该表达式的值为:3 * 4 +

面试算法实习生

昨天刚开始是笔试,完事后两面技术面,最后hr面.第一次面试算法实习生,在此做下笔记,记录面试问题与自己的不足. 笔试: 回来看牛客网,居然发现大部分都有,但可惜我还没刷. 回忆下知识点从网上搜出这套题好多都有(2,5,6,7,8,9,21,42,46,48,49,53,55) 一.选择题 1. 某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A) A. 关联规则发现 B. 聚类 C. 分类 D. 自然语言处理 2. 以下两种描述分别对应哪两种对分类算法

面试算法爱好者书籍/OJ推荐

面试算法爱好者书籍/OJ推荐 这个书单也基本适用于准备面试. 一.教科书 基本上一般的算法课本介绍的范围都不会超出算法导论和算法引论的范围.读完这两本书.其它的算法课本大致翻翻也就知道是什么货色了. 1. 算法导论 这本书的内容用三个字来总结,就是伟光正.基本上囊括了经常使用算法的方方面面,证明巨细无遗,十分适合刚開始学习的人阅读. 可是这本书的一大问题就是.证明尽管具体.却从未解释算法背后的理由.仅仅告诉你怎样去做.却从未探讨过为何如此去做. 2.算法引论(Introduction to Al

《Python程序员面试算法宝典》PDF高清版

<Python程序员面试算法宝典>PDF高清版 链接: https://pan.baidu.com/s/1Rtvk_KCmdwvGliyq9Pg9OQ 提取码: i69a ? 内容简介  · · · · · · 本书是一本讲解程序员面试笔试算法的书,代码采用Python语言编写,书中除了讲解如何解答算法问题以外,还引入了例子辅以说明,让读者更容易理解. 本书几乎将程序员面试笔试过程中算法类真题一网打尽,在题目的广度上,通过各种渠道,搜集了近3年来几乎所有IT企业面试笔试算法的高频题目,所选择题

2的整数次幂 面试算法(一)

import java.util.Scanner; public class Pow { public static void main(String []args) throws Exception { Scanner s = new Scanner(System.in); int i = s.nextInt(); System.out.println(test(i)); } /** * 面试算法题目 * 描述 * 请使用递归的方式判断一个给定的整数是否为2的整数次幂. * 提示:当一个数 n

远景面试算法题——FolderSize

描述 文件被存储在磁盘上的时候,通常为cluster方式.每个cluster具有固定的大小,一个文件所消耗的空间量始终是cluster大小的整数倍.因此,如果cluster的大小为100字节,165字节的文件将会使用实际使用200字节的存储空间,造成35个空间的浪费. 一个folder会有多个file,每个file单独计算浪费空间:如果某个folder没有出现,浪费空间为0 定义 Method signature: int[] calculateWaste(String[] files, int

一道看似非常难的面试算法题

这是昨天面试百度时碰到的一道算法题:任意数分三组,使得每组的和尽量相等.由于时间仓促,加之面试时头昏脑涨,这道题没做出来甚至没有给出思路,这让我多少有些遗憾和不甘.因为最近接触算法的东西较多而且本身对算法感兴趣,所以回家之后绞尽脑汁想把这题做出来.其实刚看到这题时感觉不难,但是因为数字个数及数值的不确定,我感觉这题越想越难.昨天一晚上没有睡好,甚至做梦都在想这题! 今天上午在多个群里问了这题,都没有给出思路,真是绝望至极.很多人都说 n/3 的思路,其实这种思路一开始就是死胡同.本人属于那种不会

偶然看到的面试算法题_最短时间找出十包粉末中的两蓝粉末。

题目:有4个杯子,10包粉末,其中有2包溶于水变蓝,其余无色,粉末溶于水2min才能显现颜色.求找出两包蓝色粉末的最短时间.假设水和粉末用不完. 解:以下给出四种解法,标记10包粉末为(1,2 ... ) 杯子为[1,2,3,4]首先我想会不会是有某种算法,dp 二分..@[email protected]..没有,懵懵的. 法一:这是我最初想到的比较傻的方法 第一趟:[12,34,56,78] 每个杯子分别放两包加水融化,剩下两包不管.可能的情况: (1)0个杯子变色,说明剩下两包就是蓝粉末