www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]原文作者的解法不錯(cuò),我一開始沒想到。先貼原文,然后再把我的方法詳細(xì)說下。?題目:輸入一個(gè)正整數(shù)數(shù)組,將它們連接起來排成一個(gè)數(shù),輸出能排出的所有數(shù)字中最小的一個(gè)。例如輸入數(shù)組{32, ?321},則輸出

原文作者的解法不錯(cuò),我一開始沒想到。先貼原文,然后再把我的方法詳細(xì)說下。

?

題目:輸入一個(gè)正整數(shù)數(shù)組,將它們連接起來排成一個(gè)數(shù),輸出能排出的所有數(shù)字中最小的一個(gè)。例如輸入數(shù)組{32, ?321},則輸出這兩個(gè)能排成的最小數(shù)字32132。請給出解決問題的算法,并證明該算法。

?

==============? 以下內(nèi)容引自原文? ===============================

?

分析:這是09年6月份百度新鮮出爐的一道面試題,從這道題我們可以看出百度對應(yīng)聘者在算法方面有很高的要求。m和n,我們需要確定一個(gè)規(guī)則m和n哪個(gè)更大,而不是僅僅只是比較這兩個(gè)數(shù)字的數(shù)值哪個(gè)更大。m和n排成的數(shù)字mn和nm,如果mn<nm,那么我們應(yīng)該輸出mn,也就是m應(yīng)該排在n的前面,也就是m小于n;反之,如果nm<mn,n小于m。如果mn==mn,m等于n。

這道題其實(shí)是希望我們能找到一個(gè)排序規(guī)則,根據(jù)這個(gè)規(guī)則排出來的數(shù)組能排成一個(gè)最小的數(shù)字。要確定排序規(guī)則,就得比較兩個(gè)數(shù)字,也就是給出兩個(gè)數(shù)字

根據(jù)題目的要求,兩個(gè)數(shù)字

接下來我們考慮怎么去拼接數(shù)字,即給出數(shù)字m和n,怎么得到數(shù)字mn和nm并比較它們的大小。直接用數(shù)值去計(jì)算不難辦到,但需要考慮到的一個(gè)潛在問題是m和n都在int能表達(dá)的范圍內(nèi),但把它們拼起來的數(shù)字mn和nm就不一定能用int表示了。所以我們需要解決大數(shù)問題。一個(gè)非常直觀的方法就是把數(shù)字轉(zhuǎn)換成字符串。

另外,由于把數(shù)字m和n拼接起來得到的mn和nm,它們所含有的數(shù)字的個(gè)數(shù)肯定是相同的。因此比較它們的大小只需要按照字符串大小的比較規(guī)則就可以了。

基于這個(gè)思路,我們可以寫出下面的代碼:

// Maxinum int number has 10 digits in decimal system

const int g_MaxNumberLength = 10;

?

// String buffers to combine two numbers

char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];

char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];

?

// Given an array, print? the minimum number

// by combining all numbers in the array

void PrintMinNumber(int* numbers, int length)

{

??? if(numbers == NULL || length <= 0)

??????? return;

?

??? // Convert all numbers as strings

??? char** strNumbers = (char**)(new int[length]);

??? for(int i = 0; i < length; ++i)

??? {

??????? strNumbers[i] = new char[g_MaxNumberLength + 1];

??????? sprintf(strNumbers[i], "%d", numbers[i]);

??? }

?

??? // Sort all strings according to algorithm in function compare

??? qsort(strNumbers, length, sizeof(char*), compare);

?

??? for(int i = 0; i < length; ++i)

??????? printf("%s", strNumbers[i]);

??? printf("/n");

?

??? for(int i = 0; i < length; ++i)

??????? delete[] strNumbers[i];

??? delete[] strNumbers;

}

?

// Compare two numbers in strNumber1 and strNumber2

// if [strNumber1][strNumber2] > [strNumber2][strNumber1],

// return value > 0

// if [strNumber1][strNumber2] = [strNumber2][strNumber1],

// return value = 0

// if [strNumber1][strNumber2] < [strNumber2][strNumber1],

// return value < 0

int compare(const void* strNumber1, const void* strNumber2)

{

??? // [strNumber1][strNumber2]

??? strcpy(g_StrCombine1, *(const char**)strNumber1);

??? strcat(g_StrCombine1, *(const char**)strNumber2);

?

??? // [strNumber2][strNumber1]

??? strcpy(g_StrCombine2, *(const char**)strNumber2);

??? strcat(g_StrCombine2, *(const char**)strNumber1);

?

??? return strcmp(g_StrCombine1, g_StrCombine2);

}

上述代碼中,我們在函數(shù)compare中定義比較規(guī)則,并根據(jù)該規(guī)則用庫函數(shù)qsort排序。最后把排好序的數(shù)組輸出,就得到了根據(jù)數(shù)組排成的最小的數(shù)字。

?

找到一個(gè)算法解決這個(gè)問題,不是一件容易的事情。但更困難的是我們需要證明這個(gè)算法是正確的。接下來我們來試著證明。

?

首先我們需要證明之前定義的比較兩個(gè)數(shù)字大小的規(guī)則是有效的。一個(gè)有效的比較需要三個(gè)條件:1.自反性,即a等于a;2.對稱性,即如果a大于b,則b小于a;3.傳遞性,即如果a小于b,b小于c,則a小于c?,F(xiàn)在分別予以證明。

?

?

1.??????

?

自反性。顯然有aa=aa,所以a=a。

?

?

2.?????? 對稱性。如果a小于b,則ab

3.?????? 傳遞性。如果a小于b,則ab<ba。當(dāng)a和b用十進(jìn)制表示的時(shí)候分別為l位和m位時(shí),ab=a×10m+b,ba=b×10l+a。所以a×10m+b<b×10l+a。于是有a×10m-a< b×10l –b,即a(10m -1)<b(10l -1)。所以a/(10l -1)<b/(10m -1)。

如果b小于c,則bc<cb。當(dāng)c表示成十進(jìn)制時(shí)為m位。和前面證明過程一樣,可以得到b/(10m -1)<c/(10n -1)。

所以a/(10l -1)< c/(10n -1)。于是a(10n -1)<c(10l -1),所以a×10n +c<c×10l +a,即ac<ca。

所以a小于c。

在證明了我們排序規(guī)則的有效性之后,我們接著證明算法的正確性。我們用反證法來證明。

我們把n個(gè)數(shù)按照前面的排序規(guī)則排好順序之后,表示為A1A2A3…An。我們假設(shè)這樣排出來的兩個(gè)數(shù)并不是最小的。即至少存在兩個(gè)x和y(0<x<y<n),交換第x個(gè)數(shù)和地y個(gè)數(shù)后,A1A2…Ay…Ax…An<A1A2…Ax…Ay…An。

由于A1A2…Ax…Ay…An是按照前面的規(guī)則排好的序列,所以有Ax<Ax+1<Ax+2<…<Ay-2<Ay-1<Ay。

由于Ay-1小于Ay,所以Ay-1Ay<AyAy-1。我們在序列A1A2…Ax…Ay-1Ay…An交換Ay-1和Ay,有A1A2…Ax…Ay-1Ay…An<A1A2…Ax…AyAy-1…An(這個(gè)實(shí)際上也需要證明。感興趣的讀者可以自己試著證明)。我們就這樣一直把Ay和前面的數(shù)字交換,直到和Ax交換為止。于是就有A1A2…Ax…Ay-1Ay…An<A1A2…Ax…AyAy-1…An< A1A2…Ax…AyAy-2Ay-1…An<…< A1A2…AyAx…Ay-2Ay-1…An。

同理由于Ax小于Ax+1,所以AxAx+1<Ax+1Ax。我們在序列A1A2…AyAxAx+1…Ay-2Ay-1…An僅僅只交換Ax和Ax+1,有A1A2…AyAxAx+1…Ay-2Ay-1…An<A1A2…AyAx+1Ax…Ay-2Ay-1…An。我們接下來一直拿Ax和它后面的數(shù)字交換,直到和Ay-1交換為止。于是就有A1A2…AyAxAx+1…Ay-2Ay-1…An<A1A2…AyAx+1Ax…Ay-2Ay-1…An<…< A1A2…AyAx+1Ax+2…Ay-2Ay-1Ax…An。

所以A1A2…Ax…Ay…An< A1A2…Ay…Ax…An。這和我們的假設(shè)的A1A2…Ay…Ax…An <A1A2…Ax…Ay…An相矛盾。

所以假設(shè)不成立,我們的算法是正確的。

?

?

==============? 以上內(nèi)容引自原文? ===============================


?

?

下面寫我的思路。

?

剛拿到這題,我沒想到用字符串來做,而是想把整數(shù)拆開成一位一位的數(shù)字來進(jìn)行比較。這種方法在原文的評論中,有其他人也是這么想的。

原文的分析已經(jīng)說得比較明白了,這個(gè)題其實(shí)就是要明確一種兩個(gè)數(shù)之間的比較策略,也就是一組數(shù)的排序規(guī)則,具體點(diǎn)說,就是要重寫compare方法,如果是java語言,只要重載compareTo方法,然后用sort方法就行了。

?

假設(shè)有兩個(gè)數(shù):A和B,其中,A由m個(gè)數(shù)字組成,表示成a1a2...am,B由n個(gè)數(shù)字組成,表示成b1b2...bn.比較的規(guī)則是這樣的,從左到右比較,即從最高位開始,到最低位(個(gè)位)

1、如果ai= bi,則比較下一位數(shù);

2、如果ai< bi,則A應(yīng)該排到B前面;

3、如果A的所有位和B的前m位相同,即a1=b1,a2=b2,...,am=bm,另外,n>m。則繼續(xù)比較a1和bm+1

利用上面那個(gè)規(guī)則進(jìn)行比較,直到確定A和B之間的關(guān)系。

?

偽代碼:


[c-sharp] view plaincopy //偽代碼????int?compare(int?A,int?B){????????m?=?A的位數(shù);??????n?=?B的位數(shù);???????????k?=?min(m,n);????????for?i=[1,k]{??????????if?a[i]

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉