LeetCode:(SQL)Exchange Seats

許博淳
數據共筆
Published in
Sep 26, 2022

題目連結:https://leetcode.com/problems/exchange-seats/

這題主要是要將前後位置做交換,但比較特別的是,如果只有奇數個人,最後一個不用交換

以下題目範例

也就是說第五個人,Jeames,還是第5個人

解題思維

  1. 重新編排 id:這是我一開始想到的
  2. 邊界條件特別處理:遇到奇數個人特別處理

重新編排 id

SELECT
ROW_NUMBER()OVER() AS id,
student
FROM
Seat
ORDER BY
IF(id%2=1,id+1,id-1)
  1. 將 id分為奇數和偶數,奇數的就+1,偶數的就-1,這樣第一個人和第二個人會交換,第三個人旱地四個人會交換
  2. 上述方法無法避免邊界條件,因此重新編排id

邊界條件特別處理

SELECT
CASE
WHEN
id%2=0
THEN
id-1
ELSE
CASE
WHEN
id = (
SELECT
COUNT(*)
FROM
Seat
)
THEN
id
ELSE
id+1
END
END AS id,
student
FROM
Seat
ORDER BY
id
  1. 當數字為偶數時,固定-1
  2. 當數字為奇數時,確認是不是最後一個奇數,是的話不動,其他奇數則+1

總結

兩個解法都可以解決問題,也都不算太慢,但整體來看第一個解法的程式碼簡單很多。

實務上可能有很多邊界條件要處理,如果因此需要許多判斷式,我會認為直接整個重設數字更為簡潔。

--

--