1. 程式人生 > 其它 >ARTS Week 27

ARTS Week 27

Algorithm

本週的 LeetCode 題目為 328. 奇偶連結串列

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。

首先分別奇數和偶數頭節點,然後遍歷連結,分別找出奇數節點子連結串列和偶數節點子連結串列,最後新建一個連結串列頭,分別將奇數和偶數連結串列連線起來即可。

輸入: 1->2->3->4->5->NULL
輸出: 1->3->5->2->4->NULL
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return head;
        }
        ListNode oddDummy = head, oddNode = head;
        ListNode evenDummy = head.next, evenNode = head.next;
        while (oddNode != null && evenNode != null) {
            oddNode.next = evenNode.next;
            oddNode = oddNode.next;
            if (oddNode != null) {
                evenNode.next = oddNode.next;
                evenNode = evenNode.next;
            }
        }
        oddNode = oddDummy;
        while (oddNode.next != null) {
            oddNode = oddNode.next;
        }
        oddNode.next = evenDummy;
        return oddDummy;
    }
}

Review

本週 Review 的英文文章為:什麼是埠轉發?

埠轉發是將網路流量從一個埠傳送到同一計算機或不同計算機的另一個埠,特定的埠收到流量後將由特定的網路應用程式來處理,如80埠處理網站請求。本文介紹瞭如何進行埠轉發:

  1. 使用路由器進行埠轉發,通過將外部埠設定為1234,內部埠設定為30000,這會將埠1234流量轉發到10.0.1.2的埠30000。

  2. 帶防火牆的埠轉發,你需要使用firewall-cmd命令來轉發伺服器上的流量:

$ sudo firewall-cmd \
--add-forward-port \
port=80:proto=tcp:toport=8065

要使得更改永久化,需要新增--runtime-to-permanent

選項。

  1. 除此之外,例如使用IP轉發或設定代理。

Tip

Python中如何呼叫C語言函式?Python 中有一個 ctypes 庫,他可以呼叫動態連結庫或共享庫中的函式,因為C語言支援函式過載,為了避免在二進位制中發生衝突,因此需要extern來進行修飾。下面是一個示例:

// lib.cpp
#include <iostream>

int Function(int num) 
{
    std::cout << "Num = " << num << std::endl;
    return 0;
}

extern "C" {
    int My_Function(int a)
    {
        return Function(a);
    }
}

使用下面的編譯命令將上述程式碼編譯成共享庫:

g++ -fPIC -shared -o libTest.so lib.cpp

Python 呼叫共享庫的程式碼如下:

import ctypes
import sys
import os 

dir_path = os.path.dirname(os.path.realpath(__file__))
handle = ctypes.CDLL(dir_path + "/libTest.so")     

handle.My_Function.argtypes = [ctypes.c_int] 
  
def My_Function(num):
    return handle.My_Function(num)

Python 測試程式碼如下:

from myLib import *

My_Function(16)

執行結果如下:

$ python3 test.py
Num = 16

Share

生活已逐漸已回到正軌上,過去一週基本上每天都會出去快走or跑步,活動活動鍛鍊一下,感覺不論何種情況,身體永遠是第一位的。