LeetCode 刷題集 - 數(shù)組晒夹、鏈表裆馒、棧、隊列(1)

數(shù)組:為什么很多編程語言中數(shù)組都從 0 開始編號丐怯?

鏈表:如何實(shí)現(xiàn) LRU 緩存淘汰算法?

鏈表:如何輕松寫出正確的鏈表代碼喷好?

跳表:為什么 Redis 一定要用跳表來實(shí)現(xiàn)有序集合?

棧:如何實(shí)現(xiàn)瀏覽器的前進(jìn)和后退功能读跷?

隊列:隊列在線程池等有限資源池中的應(yīng)用

LeetCode題目:

Array:

1.移動零

func moveZeroes(_ nums: inout [Int]) {
        var j = 0
        for i in 0..<nums.count {
            if nums[i] != 0 {
                nums[j] = nums[i]
                if (i != j) {
                    nums[i] = 0
                }
                j += 1
            }
        }
    }

2.盛最多水的容器

func maxArea(_ height: [Int]) -> Int {
        // 2.雙指針 移動短板方法
        var left = 0, right = height.count - 1, res = 0
        while left != right {
            let area = min(height[left], height[right]) * (right - left)
            res = max(area, res)
            if height[left] <= height[right] {
                left += 1
            } else {
                right -= 1
            }
        }
        return res
    }

3.爬樓梯

-Bottom-up DP

func climbStairs(_ n: Int) -> Int {
        if n == 1 {
            return 1
        }
        var first = 1, second = 1, res = 0
        for _ in 0..<n - 1 {
            res = first + second
            first = second
            second = res
        }
        return res
    }

-記憶化搜索(加緩存)

    var memDict: Dictionary<Int, Int> = Dictionary<Int, Int>()
    func climbStairs(_ n: Int) -> Int {
        if n == 1 {
            return 1
        }
        if n == 2 {
            return 2
        }
        //memoize
        guard (memDict[n] != nil) else {
            memDict[n] = climbStairs(n - 1) + climbStairs(n - 2)
            return memDict[n]!
        }
        return memDict[n]!
    }

4.三數(shù)之和

func threeSum(_ nums: [Int]) -> [[Int]] {
        //非暴力 內(nèi)層雙指針夾逼法
        if nums.count <= 2 {
            return []
        }
        let sortedArray = nums.sorted(by: <)
        var res: Array<Array<Int>> = []
        for i in 0..<sortedArray.count - 2 {
            // 略過i指向的重復(fù)元素
            if i > 0 && sortedArray[i] == sortedArray[i - 1] {
                continue
            }
            var j = i + 1
            var k = sortedArray.count - 1
            while j < k {
                if sortedArray[i] + sortedArray[j] + sortedArray[k] == 0 {
                    res.append([sortedArray[i], sortedArray[j], sortedArray[k]])
                    // 略過j指向的重復(fù)元素
                    while j < k && sortedArray[j] == sortedArray[j + 1] {
                        j += 1
                    }
                    j += 1
                } else if sortedArray[i] + sortedArray[j] + sortedArray[k] < 0 {
                    j += 1
                } else {
                    k -= 1
                }
            }
        }
        return res
    }

5.兩數(shù)之和

func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var dict = Dictionary<Int, Int>()
        for (index, value) in nums.enumerated() {
            if let value = dict[target - value] {
                // 有值 返回結(jié)果
                return [value, index]
            } else {
                // 沒值 往字典里添
                dict.updateValue(index, forKey: value)
            }
        }
        return []
    }

6.刪除排序數(shù)組中的重復(fù)項

func removeDuplicates(_ nums: inout [Int]) -> Int {
        var i = 0
        let originNumsCount = nums.count
        var deletedCount = 0
        while i < nums.count - 1 {
            if nums[i] == nums[i + 1] {
                nums.remove(at:i)
                deletedCount += 1
            } else {
                i += 1
            }
        }
        return originNumsCount - deletedCount
    }

7.旋轉(zhuǎn)數(shù)組

-可以開一個新數(shù)組的情況下

func rotate(_ nums: inout [Int], _ k: Int) {
        var newArray = nums
        for (index, i) in nums.enumerated() {
            let newIndex = (index + k) % nums.count
            newArray[newIndex] = i
        }
        nums = newArray
    }

-不開新數(shù)組的情況下

    func rotate(_ nums: inout [Int], _ k: Int) {
        if k == 0 {
            return
        }
        for i in 0..<gcd(nums.count, k) {
            var index = i
            var cacheOutNum = nums[i]
            repeat{
                let newIndex = (index + k) % nums.count
                let cacheInNum = nums[newIndex]
                nums[newIndex] = cacheOutNum
                cacheOutNum = cacheInNum
                index = newIndex
            }while index != i
        }
    }

-歐幾里得算法公式解法:

    // gcd(a, b) = gcd(b, a % b)
    func gcd(_ a: Int, _ b: Int) -> Int {
      let r = a % b
      if r != 0 {
        return gcd(b, r)
      } else {
        return b
      }
    }

8.合并兩個有序數(shù)組

-去0拼接然后排序

    func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
        if n == 0 {
            return
        }
        nums1.replaceSubrange((nums1.count - nums2.count)...(nums1.count - 1), with: nums2)
        nums1.sort(by: <)
    }

9.加一

func plusOne(_ digits: [Int]) -> [Int] {
            var mutableDigits = digits
            // 最后一位不是9
            if mutableDigits.last != 9 {
                var last = mutableDigits.removeLast()
                last += 1
                mutableDigits.append(last)
            } else {
                var j = mutableDigits.count - 1
                while mutableDigits[j] == 9 {
                    j -= 1
                    if j < 0 {
                        //全是9
                        return [1] + Array(repeating:0, count:mutableDigits.count)
                    }
                }
                // 到這說明不全是9 并且j指向的是第一個不為9的元素
                mutableDigits[j] += 1
                mutableDigits.replaceSubrange((j + 1)...mutableDigits.count - 1, with:Array(repeating: 0, count: mutableDigits.count - 1 - j))
            }
            return mutableDigits
        }

Linked List :

10.環(huán)形鏈表

func hasCycle(_ head: ListNode?) -> Bool {
                var preNode = head
                var nextNode = head?.next
                while nextNode?.next != nil {
                    preNode = preNode?.next
                    nextNode = nextNode?.next?.next
                    if preNode?.val == nextNode?.val {
                        return true
                    }
                }
                return false
    }

11.環(huán)形鏈表 II

     func detectCycle(_ head: ListNode?) -> ListNode? {
        var slowNode: ListNode? = head
        var fastNode: ListNode? = head
        while true {
            if fastNode == nil || fastNode?.next == nil {return nil}
            fastNode = fastNode?.next?.next
            slowNode = slowNode?.next
            if fastNode === slowNode {break}
        }
        fastNode = head
        while true {
            if fastNode === slowNode {return fastNode}
            fastNode = fastNode?.next
            slowNode = slowNode?.next
        }
    }

12.反轉(zhuǎn)鏈表

func reverseList(_ head: ListNode?) -> ListNode? {
        var dummyNode: ListNode? = nil
        var currentNode = head
        while currentNode != nil {
            let nextNode = currentNode?.next
            currentNode?.next = dummyNode
            dummyNode = currentNode
            currentNode = nextNode
        }
        return dummyNode
    }

13.兩兩交換鏈表中的節(jié)點(diǎn)

    func swapPairs(_ head: ListNode?) -> ListNode? {
       let dummyNode = ListNode(0)
       var currentNode = dummyNode
       dummyNode.next = head
       while currentNode.next?.next != nil {
           let node1 = currentNode.next
           let node2 = currentNode.next?.next
           currentNode.next = node2
           node1?.next = node2?.next
           node2?.next = node1
           currentNode = node1!
       }
       return dummyNode.next
    }

14.K 個一組翻轉(zhuǎn)鏈表

func reverseKGroup(_ head: ListNode?, _ k: Int) -> ListNode? {
        let dummyNode: ListNode? = ListNode(0)
        dummyNode?.next = head
        var preNode: ListNode? = dummyNode
        var endNode: ListNode? = dummyNode
        while endNode?.next != nil {
            for _ in 1...k {
                endNode = endNode?.next
            }
            if endNode == nil {break}
            let startNode = preNode?.next
            let nextNode = endNode?.next
            endNode?.next = nil
            preNode?.next = reverseList(startNode)
            startNode?.next = nextNode
            preNode = startNode
            endNode = startNode
        }
        return dummyNode?.next
    }
    func reverseList(_ head: ListNode?) -> ListNode? {
        var dummyNode: ListNode? = nil
        var currentNode = head
        while currentNode != nil {
            var nextNode = currentNode?.next
            currentNode?.next = dummyNode
            dummyNode = currentNode
            currentNode = nextNode
        }
        return dummyNode
    }

15.合并兩個有序鏈表

     func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
        var varL1 = l1
        var varL2 = l2
        let dummyNode: ListNode? = ListNode(0)
        var preNode = dummyNode
        while varL1 != nil && varL2 != nil {
            if varL1!.val <= varL2!.val {
                preNode?.next = varL1
                preNode = varL1
                varL1 = varL1?.next
            } else {
                preNode?.next = varL2
                preNode = varL2
                varL2 = varL2?.next
            }
        }
        if varL1 == nil {
            preNode?.next = varL2
        } else {
            preNode?.next = varL1
        }
        return dummyNode?.next
    }

-三指針梗搅,挪動大的,最后把j中剩下的按位置替換到nums1中的數(shù)據(jù)

    func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
        if m == 0 {
            nums1 = nums2
            return
        } else if n == 0 {
            return
        }
        var i = m - 1, j = n - 1, k = m + n - 1
        while i >= 0 && j >= 0 {
            if nums2[j] >= nums1[i] {
                nums1[k] = nums2[j]
                k -= 1
                j -= 1
            } else {
                nums1[k] = nums1[i]
                k -= 1
                i -= 1
            }
        }
        nums1[..<(j + 1)] = nums2[..<(j + 1)]
    }
}

Stack

16.最小棧

class MinStack {
    var stack = Array<Int>()
    var minStack = Array<Int>()
    init() {}
    func push(_ x: Int) {
        stack.append(x)
        guard let min = minStack.last, min < x else {
            minStack.append(x)
            return
        }
    }
    func pop() {
        if stack.last == minStack.last {
            minStack.popLast()
        }
        stack.popLast()
    }
    func top() -> Int {
        return stack.last!
    }
    func getMin() -> Int {
        return minStack.last!
    }
}

17.有效的括號

    func isValid(_ s: String) -> Bool {
            let dict = ["(" : ")", "{" : "}", "[" : "]"]
            var stack = Array<String>()
            for c in s {
                if c == "(" || c == "{" || c == "[" {
                    stack.append(String(c))
                } else {
                    // 右括號
                    guard let cur = stack.popLast() else {
                        return false
                    }
                    if dict[String(cur)] != String(c) {
                        return false
                    }
                }
            }
            return (stack.count != 0) ? false : true
        }

18.柱狀圖中最大的矩形

    func largestRectangleArea(_ heights: [Int]) -> Int {
        let len = heights.count
        if len == 0 {
            return 0
        }
        if len == 1 {
            return heights[0]
        }
        var area = 0
        let newHeights = [0] + heights + [0]
        var stack = Array<Int>()
        stack.append(0)
        for i in 1...newHeights.count - 1 {
            while (newHeights[stack.last!] > newHeights[i]) {
                let height = newHeights[stack.removeLast()]
                let width = i - stack.last! - 1
                area = max(area, width * height)
            }
            stack.append(i)
        }
        return area
    }

19.接雨水

class Solution {
    func trap(_ height: [Int]) -> Int {
        var stack = Array<Int>()
        var res = 0
        var currentIndex = 0
        while currentIndex < height.count {
            while !stack.isEmpty && height[currentIndex] > height[stack.last!] {
                let cancalculateIndex = stack.removeLast()
                if stack.isEmpty {
                    break
                }
                let width = currentIndex - stack.last! - 1
                let height = min(height[stack.last!], height[currentIndex]) - height[cancalculateIndex]
                res += width * height
            }
            stack.append(currentIndex)
            currentIndex += 1
        }
        return res
    }
}

Queue

20.設(shè)計循環(huán)雙端隊列

class MyCircularDeque {
    var circularQueue = Array<Int>()
    var capacity = 0
    /** Initialize your data structure here. Set the size of the deque to be k. */
    init(_ k: Int) {
        capacity = k
    }
    /** Adds an item at the front of Deque. Return true if the operation is successful. */
    func insertFront(_ value: Int) -> Bool {
        if isFull() {return false}
        circularQueue = [value] + circularQueue
        return true
    }
    /** Adds an item at the rear of Deque. Return true if the operation is successful. */
    func insertLast(_ value: Int) -> Bool {
        if isFull() {return false}
        circularQueue.append(value)
        return true
    }
    /** Deletes an item from the front of Deque. Return true if the operation is successful. */
    func deleteFront() -> Bool {
        if isEmpty() {return false}
        circularQueue.removeFirst()
        return true
    }
    /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
    func deleteLast() -> Bool {
        if isEmpty() {return false}
        circularQueue.removeLast()
        return true
    }
    /** Get the front item from the deque. */
    func getFront() -> Int {
        guard let front = circularQueue.first else {
            return -1
        }
        return front
    }
    /** Get the last item from the deque. */
    func getRear() -> Int {
        guard let rear = circularQueue.last else {
            return -1
        }
        return rear
    }
    /** Checks whether the circular deque is empty or not. */
    func isEmpty() -> Bool {
        return circularQueue.count == 0 ? true : false
    }
    /** Checks whether the circular deque is full or not. */
    func isFull() -> Bool {
        return circularQueue.count == capacity ? true : false
    }
}
/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * let obj = MyCircularDeque(k)
 * let ret_1: Bool = obj.insertFront(value)
 * let ret_2: Bool = obj.insertLast(value)
 * let ret_3: Bool = obj.deleteFront()
 * let ret_4: Bool = obj.deleteLast()
 * let ret_5: Int = obj.getFront()
 * let ret_6: Int = obj.getRear()
 * let ret_7: Bool = obj.isEmpty()
 * let ret_8: Bool = obj.isFull()
 */

21.滑動窗口最大值

class Solution {
    // 優(yōu)先隊列效览,超出時間限制了
    // func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] {
    //     if k == nums.count {
    //         return [nums.max()!]
    //     }
    //     var heap = Heap<(Int)>(array: Array(nums[0..<k]), sort: >)
    //     var ans = Array<Int>()
    //     ans.append(heap.peek()!)
    //     for i in 1...nums.count - k {
    //         heap.remove(at: heap.index(of: nums[i - 1])!)
    //         heap.insert(nums[i + k - 1])
    //         ans.append(heap.peek()!)
    //     }
    //     return ans
    // }
        func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] {
        var circularQueue = Array<Int>()
        var ans = Array<Int>()
        for i in 0..<k {
            while circularQueue.count != 0 && nums[i] >= nums[circularQueue.last!] {
                circularQueue.removeLast()
            }
            circularQueue.append(i)
        }
        ans.append(nums[circularQueue.first!])
        for i in k..<nums.count {
            while circularQueue.count != 0 && nums[i] >= nums[circularQueue.last!] {
                circularQueue.removeLast()
            }
            circularQueue.append(i)
            // 彈出超界下標(biāo)
            while circularQueue.count != 0 && (i - k) >= circularQueue.first! {
                circularQueue.removeFirst()
            }
            ans.append(nums[circularQueue.first!])
        }
       return ans
    }
}
 public struct Heap<T> {
  /** The array that stores the heap's nodes. */
  var nodes = [T]()
  /**
   * Determines how to compare two nodes in the heap.
   * Use '>' for a max-heap or '<' for a min-heap,
   * or provide a comparing method if the heap is made
   * of custom elements, for example tuples.
   */
  private var orderCriteria: (T, T) -> Bool
  /**
   * Creates an empty heap.
   * The sort function determines whether this is a min-heap or max-heap.
   * For comparable data types, > makes a max-heap, < makes a min-heap.
   */
  public init(sort: @escaping (T, T) -> Bool) {
    self.orderCriteria = sort
  }
  /**
   * Creates a heap from an array. The order of the array does not matter;
   * the elements are inserted into the heap in the order determined by the
   * sort function. For comparable data types, '>' makes a max-heap,
   * '<' makes a min-heap.
   */
  public init(array: [T], sort: @escaping (T, T) -> Bool) {
    self.orderCriteria = sort
    configureHeap(from: array)
  }
  /**
   * Configures the max-heap or min-heap from an array, in a bottom-up manner.
   * Performance: This runs pretty much in O(n).
   */
  private mutating func configureHeap(from array: [T]) {
    nodes = array
    for i in stride(from: (nodes.count/2-1), through: 0, by: -1) {
      shiftDown(i)
    }
  }
  public var isEmpty: Bool {
    return nodes.isEmpty
  }
  public var count: Int {
    return nodes.count
  }
  /**
   * Returns the index of the parent of the element at index i.
   * The element at index 0 is the root of the tree and has no parent.
   */
  @inline(__always) internal func parentIndex(ofIndex i: Int) -> Int {
    return (i - 1) / 2
  }
  /**
   * Returns the index of the left child of the element at index i.
   * Note that this index can be greater than the heap size, in which case
   * there is no left child.
   */
  @inline(__always) internal func leftChildIndex(ofIndex i: Int) -> Int {
    return 2*i + 1
  }
  /**
   * Returns the index of the right child of the element at index i.
   * Note that this index can be greater than the heap size, in which case
   * there is no right child.
   */
  @inline(__always) internal func rightChildIndex(ofIndex i: Int) -> Int {
    return 2*i + 2
  }
  /**
   * Returns the maximum value in the heap (for a max-heap) or the minimum
   * value (for a min-heap).
   */
  public func peek() -> T? {
    return nodes.first
  }
  /**
   * Adds a new value to the heap. This reorders the heap so that the max-heap
   * or min-heap property still holds. Performance: O(log n).
   */
  public mutating func insert(_ value: T) {
    nodes.append(value)
    shiftUp(nodes.count - 1)
  }
  /**
   * Adds a sequence of values to the heap. This reorders the heap so that
   * the max-heap or min-heap property still holds. Performance: O(log n).
   */
  public mutating func insert<S: Sequence>(_ sequence: S) where S.Iterator.Element == T {
    for value in sequence {
      insert(value)
    }
  }
  /**
   * Allows you to change an element. This reorders the heap so that
   * the max-heap or min-heap property still holds.
   */
  public mutating func replace(index i: Int, value: T) {
    guard i < nodes.count else { return }
    remove(at: i)
    insert(value)
  }
  /**
   * Removes the root node from the heap. For a max-heap, this is the maximum
   * value; for a min-heap it is the minimum value. Performance: O(log n).
   */
  @discardableResult public mutating func remove() -> T? {
    guard !nodes.isEmpty else { return nil }
    if nodes.count == 1 {
      return nodes.removeLast()
    } else {
      // Use the last node to replace the first one, then fix the heap by
      // shifting this new first node into its proper position.
      let value = nodes[0]
      nodes[0] = nodes.removeLast()
      shiftDown(0)
      return value
    }
  }
  /**
   * Removes an arbitrary node from the heap. Performance: O(log n).
   * Note that you need to know the node's index.
   */
  @discardableResult public mutating func remove(at index: Int) -> T? {
    guard index < nodes.count else { return nil }
    let size = nodes.count - 1
    if index != size {
      nodes.swapAt(index, size)
      shiftDown(from: index, until: size)
      shiftUp(index)
    }
    return nodes.removeLast()
  }
  /**
   * Takes a child node and looks at its parents; if a parent is not larger
   * (max-heap) or not smaller (min-heap) than the child, we exchange them.
   */
  internal mutating func shiftUp(_ index: Int) {
    var childIndex = index
    let child = nodes[childIndex]
    var parentIndex = self.parentIndex(ofIndex: childIndex)
    while childIndex > 0 && orderCriteria(child, nodes[parentIndex]) {
      nodes[childIndex] = nodes[parentIndex]
      childIndex = parentIndex
      parentIndex = self.parentIndex(ofIndex: childIndex)
    }
    nodes[childIndex] = child
  }
  /**
   * Looks at a parent node and makes sure it is still larger (max-heap) or
   * smaller (min-heap) than its childeren.
   */
  internal mutating func shiftDown(from index: Int, until endIndex: Int) {
    let leftChildIndex = self.leftChildIndex(ofIndex: index)
    let rightChildIndex = leftChildIndex + 1
    // Figure out which comes first if we order them by the sort function:
    // the parent, the left child, or the right child. If the parent comes
    // first, we're done. If not, that element is out-of-place and we make
    // it "float down" the tree until the heap property is restored.
    var first = index
    if leftChildIndex < endIndex && orderCriteria(nodes[leftChildIndex], nodes[first]) {
      first = leftChildIndex
    }
    if rightChildIndex < endIndex && orderCriteria(nodes[rightChildIndex], nodes[first]) {
      first = rightChildIndex
    }
    if first == index { return }
    nodes.swapAt(index, first)
    shiftDown(from: first, until: endIndex)
  }
  internal mutating func shiftDown(_ index: Int) {
    shiftDown(from: index, until: nodes.count)
  }
}
extension Heap where T: Equatable {
  /** Get the index of a node in the heap. Performance: O(n). */
  public func index(of node: T) -> Int? {
    return nodes.index(where: { $0 == node })
  }
  /** Removes the first occurrence of a node from the heap. Performance: O(n). */
  @discardableResult public mutating func remove(node: T) -> T? {
    if let index = index(of: node) {
      return remove(at: index)
    }
    return nil
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末无切,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丐枉,更是在濱河造成了極大的恐慌哆键,老刑警劉巖汉柒,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炬守,死亡現(xiàn)場離奇詭異,居然都是意外死亡分预,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門噩峦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭沟,“玉大人,你說我怎么就攤上這事识补∽寤矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵凭涂,是天一觀的道長祝辣。 經(jīng)常有香客問我,道長切油,這世上最難降的妖魔是什么蝙斜? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮澎胡,結(jié)果婚禮上孕荠,老公的妹妹穿的比我還像新娘。我一直安慰自己攻谁,他們只是感情好稚伍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戚宦,像睡著了一般个曙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上受楼,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天垦搬,我揣著相機(jī)與錄音,去河邊找鬼艳汽。 笑死悼沿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骚灸。 我是一名探鬼主播糟趾,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甚牲!你這毒婦竟也來了义郑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤丈钙,失蹤者是張志新(化名)和其女友劉穎非驮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雏赦,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劫笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年芙扎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片填大。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戒洼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出允华,到底是詐尸還是另有隱情圈浇,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布靴寂,位于F島的核電站磷蜀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏百炬。R本人自食惡果不足惜褐隆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剖踊。 院中可真熱鬧庶弃,春花似錦、人聲如沸蜜宪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圃验。三九已至,卻和暖如春缝呕,著一層夾襖步出監(jiān)牢的瞬間澳窑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工供常, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摊聋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓栈暇,卻偏偏與公主長得像麻裁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子源祈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容