劍指offer 難題記錄

2021-08-26 05:38:13 字數 2929 閱讀 4880

將最近幾天遇到的難題,整理記錄下來,以備複習!

記錄兩個有趣的**csdn排行第一部落格和左耳朵陳浩關於fork

一、正規表示式匹配

本文參考:正規表示式

題目描述

請實現乙個函式用來匹配包括』.』和』『的正規表示式。模式中的字元』.』表示任意乙個字元,而』『表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串」aaa」與模式」a.a」和」ab*ac*a」匹配,但是與」aa.a」和」ab*a」均不匹配。

思路a. 模式串下乙個字元為*,即(pattern + 1) == 『『:

1) 如果當前字元匹配,即*str = *pattern或者*str = 『.』 && *pattern != 『\0』,三種可能:

1、模式串當前字元出現0次,即*表示當前字元出現0次,

則str = str, pattern = pattern + 2;

2、模式串當前字元出現1次,即*表示當前字元出現1次,

則str = str + 1, pattern = pattern + 2;

3、模式串當前字元出現2次或2次以上,即*表示當前字元出現2次或以上,

則str = str + 1, pattern = pattern;

2)如果當前字元不匹配,則只能讓*表示當前字元出現0次,則str = str, pattern = pattern + 2;

b.模式串下乙個字元不為*

如果當前字元匹配,即*str = *pattern或者*str = 『.』 && *pattern != 『\0』,則str = str + 1, pattern = pattern + 1.

**

bool matchcore(char* str, char* pattern)

else

}if (*str == *pattern || (*pattern == '.' && *str != '\0'))

return

false;

}bool

match(char* str, char* pattern)

二、滑動視窗的最大值

題目給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為。

針對陣列的滑動視窗有以下6個: , , , , ,

**

vector

maxinwindows(const

vector

& num, unsigned

int size)

//當當前視窗的隊首索引失效時將其移除

while (deq.size() && i-deq.front()+1 > size)

//插入元素的索引(對應值為當前視窗最大值)

deq.push_back(i);

//當視窗首位址i>=size時,才尋找視窗最大值

if (size && i + 1 >= size)

res.push_back(num[deq.front()]);

}return res;

} vector

num;

vector

res = maxinwindows(num, 3);

for (auto it = res.begin(); it != res.end(); ++it)

cout

<< *it << " ";

cout

<< endl;

三、撲克牌順子

本文參考了撲克牌順子 題目

從撲克牌中隨機抽取5張,判斷是不是乙個順子。2-10為數字本身,a為1,j為11,q為12,k為13,而大小王可以為任何數字。

思路1.關鍵思想就是把大小王看成0,而0又可以當做任何數字

2.首先判斷出5個牌裡面0的個數

3.判斷出相鄰數字之間的間隔,若間隔數大於0的個數,那麼0就無法填充使之成為順子,例如0,1,4,5,6,其中1到4的間隔差了4-1-1=2,而1個0是無法進行填充的,組成不了順子

4.判斷過程中若出現兩個非零數字相等,那麼絕不可能為順子

**

bool iscontinuous( vector

numbers )

//start: the first non-zero

int end = start+1; //the second non-zero

while(endif(numbers[end] == numbers[start]) return

false;

numofgap += (numbers[end]-numbers[start]-1);

start = end;

end++;

}//coutnumofzero)?false:true;

}

四、整數中1出現的次數(從1到n整數中1出現的次數)

題目:輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11和12,1一共出現了5次。

思路解法一:不考慮時間效率的解法,時間複雜度o(nlogn)。

int numberof1(int num)

return

count;

} int numberof1between1andn_solution(int n)

解法二:

參考:《程式設計師**面試指南》

int numberof1between1andn_solution(int n)

劍指 offer 刷題記錄

任誰都躲不過找工作的問題,好希望能多準備一些時間,奈何時間不等人,每天刷幾道題,並且記錄下來吧 def replacespace s write code here num space 0 new s for i in range len s if i num space 1 for i in ra...

劍指offer 簡單題記錄

面試題58 ii.左旋轉字串 字串的左旋轉操作是把字串前面的若干個字元轉移到字串的尾部。請定義乙個函式實現字串左旋轉操作的功能。比如,輸入字串 abcdefg 和數字2,該函式將返回左旋轉兩位得到的結果 cdefgab 示例 1 輸入 s abcdefg k 2 輸出 cdefgab 示例 2 輸入...

劍指offer刷題記錄

遞迴法 鍊錶的後續遍歷,並用self.k來記錄倒數節點的位置,找到了就返回找到的節點,否則返回none coding utf 8 class listnode def init self,x self.val x self.next none class solution def init self...