首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 直播 - 雄鷹網(wǎng)校 - 團(tuán)購(gòu) - 書(shū)城 - 模考 - 學(xué)習(xí)通 - 導(dǎo)航 -
首頁(yè)網(wǎng)校萬(wàn)題庫(kù)直播雄鷹網(wǎng)校團(tuán)購(gòu)書(shū)城?論壇實(shí)用文檔作文大全寶寶起名
2015中考
法律碩士
2015高考
MBA考試
2015考研
MPA考試
在職研
中科院
考研培訓(xùn)
專(zhuān)升本
自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語(yǔ)
零起點(diǎn)日語(yǔ)
職稱(chēng)英語(yǔ)
口譯筆譯
申碩英語(yǔ)
零起點(diǎn)韓語(yǔ)
商務(wù)英語(yǔ)
日語(yǔ)等級(jí)
GMAT考試
公共英語(yǔ)
職稱(chēng)日語(yǔ)
新概念英語(yǔ)
專(zhuān)四專(zhuān)八
博思考試
零起點(diǎn)英語(yǔ)
托?荚
托業(yè)考試
零起點(diǎn)法語(yǔ)
雅思考試
成人英語(yǔ)三級(jí)
零起點(diǎn)德語(yǔ)
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱(chēng)計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷(xiāo) 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問(wèn)
管理咨詢(xún)
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營(yíng)養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話(huà)
證券從業(yè)
跟 單 員
秘書(shū)資格
電子商務(wù)
期貨考試
國(guó)際商務(wù)
心理咨詢(xún)
營(yíng) 銷(xiāo) 師
司法考試
國(guó)際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱(chēng)
法律顧問(wèn)
ACCA考試
初級(jí)會(huì)計(jì)職稱(chēng)
資產(chǎn)評(píng)估師
高級(jí)經(jīng)濟(jì)師
注冊(cè)會(huì)計(jì)師
高級(jí)會(huì)計(jì)師
美國(guó)注冊(cè)會(huì)計(jì)師
審計(jì)師考試
國(guó)際內(nèi)審師
注冊(cè)稅務(wù)師
理財(cái)規(guī)劃師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測(cè)繪師
質(zhì)量工程師
巖土工程師
注冊(cè)給排水
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
暖通工程師
咨詢(xún)工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
消防工程師
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
寶寶起名
繽紛校園
實(shí)用文檔
入黨申請(qǐng)
英語(yǔ)學(xué)習(xí)
思想?yún)R報(bào)
作文大全
工作總結(jié)
求職招聘 論文下載 直播課堂
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員 > 正文

2015年軟件水平考試程序員精選題(13)

考試吧整理“2015年軟件水平考試程序員精選題(13)”供考生參考,更多軟件水平考試資訊和備考資料請(qǐng)關(guān)注考試吧軟件水平考試網(wǎng)。

  查看匯總:2015軟件水平考試程序員精選題匯總

  在從1到n的正數(shù)中1出現(xiàn)的次數(shù)

  題目:輸入一個(gè)整數(shù)n,求從1到n這n個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)。

  例如輸入12,從1到12這些整數(shù)中包含1 的數(shù)字有1,10,11和12,1一共出現(xiàn)了5次。

  分析:這是一道廣為流傳的google面試題。用最直觀的方法求解并不是很難,但遺憾的是效率不是很高;而要得出一個(gè)效率較高的算法,需要比較強(qiáng)的分析能力,并不是件很容易的事情。當(dāng)然,google的面試題中簡(jiǎn)單的也沒(méi)有幾道。

  首先我們來(lái)看最直觀的方法,分別求得1到n中每個(gè)整數(shù)中1出現(xiàn)的次數(shù)。而求一個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù),就和本面試題系列的第22題很相像了。我們每次判斷整數(shù)的個(gè)位數(shù)字是不是1。如果這個(gè)數(shù)字大于10,除以10之后再判斷個(gè)位數(shù)字是不是1;谶@個(gè)思路,不難寫(xiě)出如下的代碼:

  int NumberOf1(unsigned int n);

  /////////////////////////////////////////////////////////////////////////////

  // Find the number of 1 in the integers between 1 and n

  // Input: n - an integer

  // Output: the number of 1 in the integers between 1 and n

  /////////////////////////////////////////////////////////////////////////////

  int NumberOf1BeforeBetween1AndN_Solution1(unsigned int n)

  {

  int number = 0;

  // Find the number of 1 in each integer between 1 and n

  for(unsigned int i = 1; i <= n; ++ i)

  number += NumberOf1(i);

  return number;

  }

  /////////////////////////////////////////////////////////////////////////////

  // Find the number of 1 in an integer with radix 10

  // Input: n - an integer

  // Output: the number of 1 in n with radix

  /////////////////////////////////////////////////////////////////////////////

  int NumberOf1(unsigned int n)

  {

  int number = 0;

  while(n)

  {

  if(n % 10 == 1)

  number ++;

  n = n / 10;

  }

  return number;

  }

  這個(gè)思路有一個(gè)非常明顯的缺點(diǎn)就是每個(gè)數(shù)字都要計(jì)算1在該數(shù)字中出現(xiàn)的次數(shù),因此時(shí)間復(fù)雜度是O(n)。當(dāng)輸入的n非常大的時(shí)候,需要大量的計(jì)算,運(yùn)算效率很低。我們?cè)囍页鲆恍┮?guī)律,來(lái)避免不必要的計(jì)算。

  我們用一個(gè)稍微大一點(diǎn)的數(shù)字21345作為例子來(lái)分析。我們把從1到21345的所有數(shù)字分成兩段,即1-1235和1346-21345。

  先來(lái)看1346-21345中1出現(xiàn)的次數(shù)。1的出現(xiàn)分為兩種情況:一種情況是1出現(xiàn)在最高位(萬(wàn)位)。從1到21345的數(shù)字中,1出現(xiàn)在10000-19999這10000個(gè)數(shù)字的萬(wàn)位中,一共出現(xiàn)了10000(104)次;另外一種情況是1出現(xiàn)在除了最高位之外的其他位中。例子中1346-21345,這20000個(gè)數(shù)字中后面四位中1出現(xiàn)的次數(shù)是2000次(2*103,其中2的第一位的數(shù)值,103是因?yàn)閿?shù)字的后四位數(shù)字其中一位為1,其余的三位數(shù)字可以在0到9這10個(gè)數(shù)字任意選擇,由排列組合可以得出總次數(shù)是2*103)。

  至于從1到1345的所有數(shù)字中1出現(xiàn)的次數(shù),我們就可以用遞歸地求得了。這也是我們?yōu)槭裁匆?-21345分為1-1235和1346-21345兩段的原因。因?yàn)榘?1345的最高位去掉就得到1345,便于我們采用遞歸的思路。

  分析到這里還有一種特殊情況需要注意:前面我們舉例子是最高位是一個(gè)比1大的數(shù)字,此時(shí)最高位1出現(xiàn)的次數(shù)104(對(duì)五位數(shù)而言)。但如果最高位是1呢?比如輸入12345,從10000到12345這些數(shù)字中,1在萬(wàn)位出現(xiàn)的次數(shù)就不是104次,而是2346次了,也就是除去最高位數(shù)字之后剩下的數(shù)字再加上1。

  基于前面的分析,我們可以寫(xiě)出以下的代碼。在參考代碼中,為了編程方便,我把數(shù)字轉(zhuǎn)換成字符串了。

  #include "string.h"

  #include "stdlib.h"

  int NumberOf1(const char* strN);

  int PowerBase10(unsigned int n);

  /////////////////////////////////////////////////////////////////////////////

  // Find the number of 1 in an integer with radix 10

  // Input: n - an integer

  // Output: the number of 1 in n with radix

  /////////////////////////////////////////////////////////////////////////////

  int NumberOf1BeforeBetween1AndN_Solution2(int n)

  {

  if(n <= 0)

  return 0;

  // convert the integer into a string

  char strN[50];

  sprintf(strN, "%d", n);

  return NumberOf1(strN);

  }

  /////////////////////////////////////////////////////////////////////////////

  相關(guān)推薦:

  2015年軟考信息技術(shù)處理員考前知識(shí)點(diǎn)總結(jié)匯總

  2015年軟件水平考試《程序員》提高練習(xí)題匯總

  2015軟件水平考試《程序員》知識(shí)點(diǎn)總結(jié)匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004- 考試吧軟件水平考試網(wǎng) All Rights Reserved 
中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
在線(xiàn)模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧