原创 劍指之字符串的排列

題目描述: 輸入一個字符串,打印出該字符串中字符的所有排列。 你可以以任意順序返回這個字符串數組,但裏面不能有重複元素。 示例: 輸入:s = “abc” 輸出:[“abc”,“acb”,“bac”,“bca”,“cab”,“c

原创 劍指Offer之第n個醜數

題目描述: 題目: 我們把只包含因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。 示例: 輸入: n = 10 輸出: 12 解釋: 1, 2, 3, 4, 5, 6, 8, 9

原创 jdk7HashMap擴容和擴容死鎖分析

1. 前言 jdk7的HashMap擴容過程在多線程下容易形成環,線程不安全,那麼怎麼產生的環?要解決這個問題,就要先弄懂jdk7下的HashMap是怎麼擴容的,這裏先介紹擴容過程,然後分析環的形成過程。 2. 擴容過程 jdk

原创 劍指Offer之左旋單詞順序

題目描述: 題目: 輸入一個英文句子,翻轉句子中單詞的順序,但單詞內 字符的順序不變。爲簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. “,則輸出"student. a am I”。 注意:

原创 劍指Offer之和爲s的連續正數序列

題目描述: 輸入一個正整數 target ,輸出所有和爲 target 的連續正整數序列(至少含有兩個數)。序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。 思路分析: 思路分析 參考代碼: public int

原创 劍指Offer之0~n-1中缺失的數字

題目描述: 一個長度爲n-1的遞增排序數組中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。 思路分析: 可以考慮用二分法來解決問題:令mi

原创 劍指Offer之最小棧

題目描述: 題目: 設計一個支持 push ,pop ,top 操作,並能在常數時間內檢索到最小元素的棧。 要求: push(x) —— 將元素 x 推入棧中。 pop() —— 刪除棧頂的元素。 top() —— 獲取棧頂元素

原创 劍指Offer之排序數組中查找元素的第一個和最後一個位置

題目描述: 題目: 給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。 要求: 你的算法時間複雜度必須是 O(log n) 級別。 如果數組中不存在目標值,返回

原创 劍指Offer之第一個只出現1次的字符

題目描述: 在字符串 s 中找出第一個只出現一次的字符。若沒有,返回一個空格。 s 只包含小寫字母。 思路分析: 這裏分析一個比較好的思路,供自己參考。 要找到第1個只出現1次的字符,我們可以用一個有序的LinkedHash

原创 劍指Offer之求鏈表中的倒數第N個結點

題目描述: 輸入一個鏈表,輸出該鏈表中倒數第k 個結點.爲了符合大多數人的習慣,本題從1 開始計數,即鏈表的尾結點是倒數第1 個結點.例如一個鏈表有6 個結點,從頭結點開始它們的值依次是1 、2、3、4、5 、6。這個個鏈表的倒

原创 劍指Offer之O(1)刪除鏈表結點

題目描述: 給定一個鏈表的頭指針和要刪除的結點指針,要求用O(1)時間複雜度刪除結點。 思路: 如果刪除的結點是尾結點,先找到尾結點的前驅節點,然後刪除; 如果刪除的結點不是尾結點,將要刪除的結點的val值賦值爲後繼結點

原创 劍指Offer之翻轉鏈表

題目描述: 定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的頭結點。 思路分析: 遞歸法 該題可以用遞歸處理。一直遞歸到最後一個結點,然後翻轉最後一個結點,然後翻轉倒數第二個結點…返回之前的尾結點,即翻轉後

原创 劍指Offer之合併2個有序的鏈表

題目描述: 輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的。 思路分析: 設置一個輔助結點p,然後從頭到尾比較2個鏈表中結點的值,哪個小就把哪個插入到p的尾部,以此類推。 參考代碼: publ

原创 劍指Offer之調整奇數偶數的位置

題目描述: 輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位予數組的後半部分。 思路分析: 一審題,就可以想到用雙指針來解決。設置2個首尾指針lower和high: 從前到

原创 LeetCode之矩形覆蓋

題目描述: 我們可以用2x1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2x1的小矩形無重疊地覆蓋一個2xn的大矩形,總共有多少種方法? 思路: 由題目看出,f(n) = f(n - 1) + f(n - 2). 參考代碼: