(Google)谷歌筆試算法題:要求相鄰的兩個數都不小於或者不大於其本身的排序

如題,要求相鄰的兩個數都不小於或者不大於其本身的排序, 那麼也就是說每個數字必須同時大於等於或者小於等於它左右兩邊的數字,例如   3>=2<=6,那麼這裏2就是同時同於等於3且小於等於6,那麼如果多來點數據就是    3>=2<=6>=5<=10>=2<=6

題目描述可能本身比較模糊,我們舉例來看:

一組數據,比如已經排序好了(排序好的數據看着比較方便)

1,2,3,4,5,6,7

我們現在需要變成每個數字都大於等於或者小於等於它相鄰的兩個數

1 <= 3 >= 2 <= 5> =4 < =7 >= 6        

現在排序的方法有很多,我們可以先求出中位數,然後開始補,也可以先排序,然後倒數第二和倒數第一換位等等,但是這些都是需要先排序,而這裏我們用一種一次排好的方法,即O(n),

上圖:

看清楚了嗎?我們這裏一次排序,直接寫入列表,因爲所有數字他不是 不小於 就是 不大於

先把1 寫入,

然後寫入2,

然後寫入3,這時候不滿足條件了交換2和3的位置

然後寫入4,

然後寫入5,交換

寫入6........

這裏因爲我用的是已經排好序的例子,其實大家可以想一下,亂序的也無所謂,只要滿足條件,直接排序,沒有影響

上代碼:

#!D:/workplace/python
# -*- coding: utf-8 -*-
# @File  : 大小大小排序.py
# @Author: WangYe
# @Date  : 2019/5/21
# @Software: PyCharm

in_data = input()
data = in_data.split(',')
out = []   #輸出列表

def compare(num1,num2):  #比較函數
    if num1 > num2:
        return 0
    if num1 < num2:
        return 1
    if num1 == num2:
        return 2

for k in range(len(data)):

    if (k - 1) < 0:  #存入首位
        out.append(int(data[0]))
    else:
        num1 = int(data[k-1])
        num2 = int(data[k])

        if (k%2) == 0:                    #區分基數還是偶數,也其實就是爲了相鄰的符號判斷不同而已
            if compare(num1,num2) == 1:
                out.append(num2)
                out[k-1],out[k] = out[k],out[k-1]   #元素交換
            else:
                out.append(num2)
        else:
            if compare(num1, num2) == 0:
                out.append(num2)

                out[k - 1], out[k] = out[k], out[k - 1]  # 元素交換
            else:
                out.append(num2)

print(out)

截圖:

或者亂序的

再來幾個或者等於號的

ok,大功告成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章