將最近幾天遇到的難題,整理記錄下來,以備複習!一、正規表示式匹配記錄兩個有趣的**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...