面試題 找出數列中間未排序好的子數列

2021-08-27 15:42:13 字數 1447 閱讀 1031

給出乙個數列,要求找到兩個下標,比如 1 2 3 6 5 4 7 8 9;如果我們排序這兩個下標中間的數,那麼整個數列都是排序好的了。

這個數列就是下標3和6;就是只要把 子數列6 5 4 7排序好4 5 6 7那麼整個數列都排序好了。要求這個中間未排序的子串行最小。

書中給出的思路:

1 先左邊往右搜尋,找到第乙個遞減的下標,然後右邊王左搜尋,找到第乙個遞增的下標

2 兩個下標把數列分為三部分,然後找到中間子數列最小和最大值

3 然後找到左邊數列第乙個小於最小值的下標,找到右邊第乙個大於最大值的下標。

我思考了很久,終於下結論,這個思路是錯誤的,這麼經典的書,怎麼會犯那樣的錯誤呢? 到了官網查詢errata,並未提及,報告之,等等有什麼反應。

這個思路如果查詢數列如;那答案是1和5,明顯是錯誤的。

我的解題思路是:

1 從左往右選擇最大值氣泡排序一次,最後一次交換資料的地方就是最右下標;注意這裡只是一次迴圈就行了,時間複雜度o(n),不是o(n*n)

2 從右往左選擇最小值氣泡排序一次,最後一次交換資料的地方就是最左下標了。

左右下標確定,得到解。對於數列:int a = ;,原來答案是1,5更正應該是1,6

原解答程式:

int findleftend(vector&vi)

return vi.size()-1;

}int findrightstart(vector&vi)

return 0;

}int shrinkleft(vector&vi, int minindex, int start)

return 0;

}int shrinkright(vector&vi, int maxindex, int start)

return vi.size()-1;

}void findunsorted(vector&vi)

int lindex = shrinkleft(vi, minindex, leftend);

int rindex = shrinkright(vi, maxindex, rightstart);

cout<

cout<

我的解答:

JS的操作面試題,未解決

收錄幾道js面試題 實現乙個div方塊,高寬都是50px,讓他從螢幕的左邊滾動到右邊,每次步進5個畫素,10毫秒步進一次,從螢幕左邊滾動到螢幕右邊消失,然後重新從左邊出現,迴圈往復。限制 只能用js css1來做,定時器不能用setinterval,只能settimeout 在第一步的基礎上,使用工...

訊息中介軟體的面試題集

既 如何保證訊息消費時的冪等性?1.在 mqtt 協議中,給出了三種傳遞訊息時能夠提供的服務質量標準,這三種服務質量從低到高依次是 at most once 至多一次。訊息在傳遞時,最多會被送達一次。換乙個說法就是,沒什麼訊息可靠性保證,允許丟訊息。一般都是一些對訊息可靠性要求不太高的監控場景使用,...

面試題26 樹的子結構

題目 輸入兩棵二叉樹a和b,判斷b是不是a的子結構。includeusing namespace std struct binarytreenode bool doestree1hastree2 binarytreenode proot1,binarytreenode proot2 bool equ...