題目連結:https://leetcode.com/problems/exchange-seats/
這題主要是要將前後位置做交換,但比較特別的是,如果只有奇數個人,最後一個不用交換
以下題目範例
也就是說第五個人,Jeames,還是第5個人
解題思維
- 重新編排 id:這是我一開始想到的
- 邊界條件特別處理:遇到奇數個人特別處理
重新編排 id
SELECT
ROW_NUMBER()OVER() AS id,
student
FROM
Seat
ORDER BY
IF(id%2=1,id+1,id-1)
- 將 id分為奇數和偶數,奇數的就+1,偶數的就-1,這樣第一個人和第二個人會交換,第三個人旱地四個人會交換
- 上述方法無法避免邊界條件,因此重新編排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
總結
兩個解法都可以解決問題,也都不算太慢,但整體來看第一個解法的程式碼簡單很多。
實務上可能有很多邊界條件要處理,如果因此需要許多判斷式,我會認為直接整個重設數字更為簡潔。