日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

编程之旅-Day10

發(fā)布時(shí)間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程之旅-Day10 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

Day10-學(xué)習(xí)內(nèi)容

1.劍指Offer

面試題25:合并兩個(gè)排序的鏈表

面試題43:整數(shù)中1出現(xiàn)的次數(shù)

2.Leetcode

例1:求最短變換序列的長(zhǎng)度

例2:重排鏈表

3.2017年校招真題

例1:下廚房

例2:將n變?yōu)镕ibonacci數(shù)的最小步數(shù)

4.校招真題-單選題


?

1.劍指Offer

面試題25:合并兩個(gè)排序的鏈表

題目描述:

輸入兩個(gè)單調(diào)遞增的鏈表,輸出兩個(gè)鏈表合成后的鏈表,當(dāng)然我們需要合成后的鏈表滿足單調(diào)不減規(guī)則。

考察點(diǎn):代碼的魯棒性,是否考慮空鏈表的情況。

代碼:

class Solution { public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if(pHead1==nullptr){return pHead2;}else if(pHead2==nullptr){return pHead1;}ListNode* pMerge=nullptr;if(pHead1->val<=pHead2->val){pMerge=pHead1;pMerge->next=Merge(pHead1->next,pHead2);}else{pMerge=pHead2;pMerge->next=Merge(pHead1,pHead2->next);}return pMerge;}};

面試題43:整數(shù)中1出現(xiàn)的次數(shù)

題目描述:

求出1~13的整數(shù)中1出現(xiàn)的次數(shù),并算出100~1300的整數(shù)中1出現(xiàn)的次數(shù)?為此他特別數(shù)了一下1~13中包含1的數(shù)字有1、10、11、12、13因此共出現(xiàn)6次,但是對(duì)于后面問(wèn)題他就沒(méi)轍了。ACMer希望你們幫幫他,并把問(wèn)題更加普遍化,可以很快的求出任意非負(fù)整數(shù)區(qū)間中1出現(xiàn)的次數(shù)(從1 到 n 中1出現(xiàn)的次數(shù))。

思路:1.累加1到n每個(gè)整數(shù)1出現(xiàn)的次數(shù),時(shí)間復(fù)雜度是O(nlogn)。

? ? ? ? ? ?2.找出數(shù)字規(guī)律,利用遞歸快速求解,時(shí)間復(fù)雜度是O(logn)。

解析:1.數(shù)字轉(zhuǎn)換為字符數(shù)組

?char str[50];
?sprintf(str,"%d",n);

?int first=*str-'0';

int sprintf(char *str, const char *format, ...)?發(fā)送格式化輸出到?str?所指向的字符串。

? ? ? ? ?2.atoi():將字符串轉(zhuǎn)換為整型值。

https://www.cnblogs.com/bluestorm/p/3168719.html

? ? ? ? ?3.static_cast是一個(gè)強(qiáng)制類型轉(zhuǎn)換操作符

https://www.cnblogs.com/QG-whz/p/4509710.html

代碼:

class Solution { public:int NumberOf1Between1AndN_Solution(int n){if(n<=0) return 0;char str[50];sprintf(str,"%d",n);return NumberOf1(str);}int NumberOf1(const char *str){if(!str||*str<'0'||*str>'9'||*str=='\0'){return 0;}int first=*str-'0';unsigned int length=static_cast<unsigned int>(strlen(str));if(length==1&&first==0){return 0;}if(length==1&&first>0){return 1;}int numFirstDigit=0;if(first>1){numFirstDigit=PowerBase10(length-1);}else if(first==1){numFirstDigit=atoi(str+1)+1;}int numOtherDigit=first*(length-1)*PowerBase10(length-2);int numRecursive=NumberOf1(str+1);return numFirstDigit+numOtherDigit+numRecursive;}int PowerBase10(unsigned int n){int result=1;for(int i=0;i<n;i++){result*=10;}return result;} };

?

2.Leetcode

例1:求最短變換序列的長(zhǎng)度

題目描述:

Given two words (start?and?end), and a dictionary, find the length of shortest transformation sequence from?start?to?end, such that:?

  • Only one letter can be changed at a time
  • Each intermediate word must exist in the dictionary
  • For example,?

    Given:
    start?="hit"
    end?="cog"
    dict?=["hot","dot","dog","lot","log"]?

    As one shortest transformation is"hit" -> "hot" -> "dot" -> "dog" -> "cog",
    return its length5.?

    Note:

    • Return 0 if there is no such transformation sequence.
    • All words have the same length.
    • All words contain only lowercase alphabetic characters.

    思路:

    1.先把字典里面的start刪掉,然后插入end。?

    2.每次找出與隊(duì)頭元素只相差一個(gè)字符的單詞插入隊(duì)列,隊(duì)列一開始只有start。

    3.訪問(wèn)過(guò)的單詞不再訪問(wèn),故需使用一個(gè)deletelist記錄已訪問(wèn)的單詞用于之后從字典中將其刪除。

    4.當(dāng)隊(duì)列里面包含end單詞時(shí)停止循環(huán),此長(zhǎng)度就是最短長(zhǎng)度。

    代碼:

    class Solution { public:int ladderLength(string start, string end, unordered_set<string> &dict) {dict.insert(end);dict.erase(start);queue<string> q;q.push(start);int length=0;while(q.size()>0){length++;int queueLength=q.size();for(int i=0;i<queueLength;i++){start=q.front();q.pop();if(start==end) return length;vector<string> deleteList;for(unordered_set<string>::iterator iter=dict.begin();iter!=dict.end();iter++){int d=distance(start,*iter);if(d==1){q.push(*iter);deleteList.push_back(*iter);}}for(int i=0;i<deleteList.size();i++){dict.erase(deleteList[i]);}}}return 0; }int distance(string s1,string s2){int count=0;for(int i=0;i<s1.size();i++){if(s1[i]!=s2[i]) count++;}return count;} };

    例2:重排鏈表

    題目描述:

    Given a singly linked list?L:?L?0→L?1→…→L?n-1→L?n,
    reorder it to:?L?0→L?n?→L?1→L?n-1→L?2→L?n-2→…?

    You must do this in-place without altering the nodes' values.?

    For example,
    Given{1,2,3,4}, reorder it to{1,4,2,3}.?

    思路:快慢指針找到中間節(jié)點(diǎn),然后將后面的鏈表反轉(zhuǎn)(前插法),合并鏈表,注意題目要求就地解決,即不能用輔助存儲(chǔ)空間。

    代碼:

    class Solution { public:void reorderList(ListNode *head) {if(head==nullptr||head->next==nullptr||head->next->next==nullptr){return;}ListNode *fast=head;ListNode *low=head;while(fast->next!=nullptr&&fast->next->next!=nullptr){ //快慢指針找中間節(jié)點(diǎn)fast=fast->next->next;low=low->next;}fast=low->next;low->next=nullptr;while(fast!=nullptr){ //對(duì)low后面的部分逆序ListNode *temp=fast->next;fast->next=low->next;low->next=fast;fast=temp;} ListNode *p=head;ListNode *q=low->next;while(q!=nullptr&&p!=nullptr){ //合并low前后兩部分low->next=q->next;q->next=p->next;p->next=q;p=q->next;q=low->next; }} };

    3.2017年校招真題

    例1:下廚房

    題目描述:

    牛牛想嘗試一些新的料理,每個(gè)料理需要一些不同的材料,問(wèn)完成所有的料理需要準(zhǔn)備多少種不同的材料。

    ? 輸入描述:

    每個(gè)輸入包含 1 個(gè)測(cè)試用例。每個(gè)測(cè)試用例的第 i 行,表示完成第 i 件料理需要哪些材料,各個(gè)材料用空格隔開,輸入只包含大寫英文字母和空格,輸入文件不超過(guò) 50 行,每一行不超過(guò) 50 個(gè)字符。輸出描述: 輸出一行一個(gè)數(shù)字表示完成所有料理需要多少種不同的材料。

    示例1

    ? 輸入

    BUTTER FLOUR HONEY FLOUR EGG輸出 4

    解析:vector相關(guān)函數(shù) ??https://www.cnblogs.com/aminxu/p/4686332.html

    代碼:

    #include <string> #include <vector> #include <algorithm>using namespace std;int main(){string food;vector<string> vecfood;while(cin>>food){auto it=find(vecfood.begin(),vecfood.end(),food);if(it==vecfood.end()){vecfood.push_back(food);}}cout<<vecfood.size()<<endl; }

    例2:將n變?yōu)镕ibonacci數(shù)的最小步數(shù)

    題目描述:

    Fibonacci數(shù)列是這樣定義的:
    F[0] = 0
    F[1] = 1
    for each i ≥ 2: F[i] = F[i-1] + F[i-2]
    因此,Fibonacci數(shù)列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci數(shù)列中的數(shù)我們稱為Fibonacci數(shù)。給你一個(gè)N,你想讓其變?yōu)橐粋€(gè)Fibonacci數(shù),每一步你可以把當(dāng)前數(shù)字X變?yōu)閄-1或者X+1,現(xiàn)在給你一個(gè)數(shù)N求最少需要多少步可以變?yōu)镕ibonacci數(shù)。

    ? 輸入描述:

    輸入為一個(gè)正整數(shù)N(1 ≤ N ≤ 1,000,000)輸出描述: 輸出一個(gè)最小的步數(shù)變?yōu)镕ibonacci數(shù)"

    示例1

    ?輸入

    15輸出 2

    思路:分別求出比n大的最小fabonacci數(shù)和比n小的最大fabonacci數(shù),n與這兩個(gè)數(shù)差的最小值即為最小步數(shù)。

    代碼:

    #include <iostream>using namespace std;int main(){int n,upperlim,lowerlim,f;int f1=0;int f2=1;cin>>n;while(1){f=f1+f2;f1=f2;f2=f;if(f<n){lowerlim=n-f;}else{upperlim=f-n;break;}}cout<<min(upperlim,lowerlim)<<endl;return 0; }

    4.校招真題-單選題

    例1:阿里巴巴國(guó)際站的股票代碼是1688,這個(gè)數(shù)字具有這樣的特性,首先是個(gè)首位為1的4位數(shù),其次恰巧有且僅有1個(gè)數(shù)字出現(xiàn)了兩次。類似的數(shù)字還有:1861,1668等。這樣的數(shù)字一共有()個(gè)。(F)

    A.144 B.180 C.216 D.270 E.288 F.432

    解析:

    分兩種情況討論:?

    (1)若這個(gè)四位數(shù)的重復(fù)數(shù)字為1,那么首先從三個(gè)空位中選出一個(gè)給1,第二步從剩下9個(gè)可選數(shù)字中選出2個(gè)有序的排列到剩下的兩個(gè)空位中去,那么有C(1,3)*A(2,9)=3*(9!/(9-2)!)=3*9*8=216種可能;?

    (2)若這個(gè)四位數(shù)的重復(fù)數(shù)字不為1,那么首先從9個(gè)可選數(shù)字中選出一個(gè)作為重復(fù)數(shù)字(C(1,9)),并放到三個(gè)空位中的兩個(gè)(這兩個(gè)數(shù)字相同,故只涉及組合)(C(2, 3)),然后從剩下8個(gè)數(shù)字中選出一個(gè)(它的位置在重復(fù)數(shù)字確定后就自然固定了,不可選)即可,故有C(1,9)*C(2, 3)*C(1, 8)=216種可能。?

    總共:216+216=432

    ?

    例2:工程師M發(fā)明了一種游戲:M將一個(gè)小球隨機(jī)放入完全相同的三個(gè)盒子中的某一個(gè),玩家選中裝有球的盒子即獲勝;開始時(shí)M會(huì)讓玩家選擇一個(gè)盒子(選擇任何一個(gè)獲勝概率均為1/3);玩家做出選擇后,M會(huì)打開沒(méi)有被選擇的兩個(gè)盒子中的一個(gè)空盒,此時(shí)M會(huì)詢問(wèn)玩家是否更改選擇(可以堅(jiān)持第一次選擇,也可以選擇另一個(gè)沒(méi)有打開的盒子),下列敘述正確的有(E)。

    A.改選后,玩家獲勝的概率還是1/3

    B.若不改選,玩家的獲勝概率是1/2

    C.無(wú)論怎么選擇,獲勝的概率都是1/2

    D.堅(jiān)持原來(lái)的選擇獲勝概率更高

    E.選擇另一個(gè)沒(méi)有被打開的盒子獲勝概率更高

    F.獲勝概率取決于隨機(jī)因素(如小球的實(shí)際位置)

    解析:

    三個(gè)盒子A,B,C。其中,1表示有球,0表示沒(méi)球。

    選取三個(gè)盒子概率都一樣。我們假設(shè)選擇了A。

    此時(shí)有三種情況如下所示:

    情況一:我選中了有球的盒子,我更換的話將失敗,不更換的話將成功。

    情況二:我選中了沒(méi)球的盒子,我更換的話將成功,不更換的話將失敗。

    情況三:我選中了沒(méi)球的盒子,我更換的話將成功,不更換的話將失敗。

    綜上,我們發(fā)現(xiàn)更換了成功的概率是2/3;二不更換成功的概率是1/3。

    因此選擇E。

    ?

    例3:下列不是進(jìn)程間的通信方式的是(B)

    A.管道 B.回調(diào) C.共享內(nèi)存 D.消息隊(duì)列 E.socket F.信號(hào)量

    解析:

    管道:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
    回調(diào):?是一種編程機(jī)制
    共享內(nèi)存:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。 ??
    消息隊(duì)列:消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
    socket:socket也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。
    信號(hào)量:信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
    ?

    例4:已知IBM的PowerPC是big-endian字節(jié)序列而Intel的X86是little-endian字節(jié)序,如果在地址啊存儲(chǔ)的整形值時(shí)0x04030201,那么地址為a+3的字節(jié)內(nèi)存儲(chǔ)的值在PowerPC和Intel X86結(jié)構(gòu)下的值分別是?(A)

    A.1 4 B.1 3 C.4 1 D.3 1 E.4 4 F.1 1

    解析:大端從大地址開始存儲(chǔ),小端相反,兩者都是從數(shù)據(jù)低位開始存起; 假設(shè)從上至下地址遞增,則

    PowerPC(大):??????????????????? Intel X86(小):

    04??????????????????????????????????????????? 01??????????????????? 低

    03??????????????????????????????????????????? 02?????????????????????

    02??????????????????????????????????????????? 03?????????????????????

    01??????????????????????????????????????????? 04???????????????????? 高

    a+3指向最大的地址,所以分別為1 4

    ?

    例5:在TCP/IP建立連接過(guò)程中,客戶端或服務(wù)器的狀態(tài)轉(zhuǎn)移說(shuō)法錯(cuò)誤的是?(D)

    ?A.經(jīng)歷SYN_RECV狀態(tài)

    ?B.經(jīng)歷SYN_SEND狀態(tài)

    ?C.經(jīng)歷ESTABLISHED狀態(tài)

    ?D.經(jīng)歷TIME_WAIT狀態(tài)

    ?E.服務(wù)器在收到syn包時(shí)將加入半連接隊(duì)列

    ?F.服務(wù)器收到客戶端的ack包后將從半連接隊(duì)列刪除

    解析:TIME_WAIT是斷開連接時(shí)的狀態(tài)(屬于第四次握手)

    ?

    例6:已知一棵二叉樹的先序和中序遍歷序列如下:先序:A、B、C、D、E、F、G、H、I,J中序:C、B、A、E、F、D、I、H、J、G其后序遍歷序列為:(E)

    ?A.C、B、D、E、A、G、I、H、J、F

    ?B.C、B、D、A、E、G、I、H、J、F

    ?C.C、E、D、B、I、J、H、G、F、A

    ?D.C、E、D、B、I、H、J、G、F、A

    ?E.C、B、F、E、I、J、H、G、D、A

    ?F.C、B、F、E、I、H、J、G、D、A

    參考:

    https://blog.csdn.net/Cassiel_Paris/article/details/80203633

    https://www.cnblogs.com/chongerlishan/p/5971024.html

    ?

    總結(jié)

    以上是生活随笔為你收集整理的编程之旅-Day10的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。