7-4 求链式线性表的倒数第K项(最佳解法)(List容器)
先看問題描述:
給定一系列正整數,請設計一個盡可能高效的算法,查找倒數第K個位置上的數字。
輸入格式:
輸入首先給出一個正整數K,隨后是若干正整數,最后以一個負整數表示結尾(該負數不算在序列內,不要處理)。
輸出格式:
輸出倒數第K個位置上的數據。如果這個位置不存在,輸出錯誤信息NULL。
輸入樣例:
4 1 2 3 4 5 6 7 8 9 0 -1
輸出樣例:
7
第一步:讀題,找關鍵詞,并摘取。
題目大意不多說了哈,直接找關鍵詞。 關鍵詞:
1.高效的算法(不完美的手寫算法不可取,很可能超時,當然大佬自行略過)
2.以負整數表示結尾。
↑摘下眼鏡好好康康,是負整數,不是-1哦。
第二步:分析思路:
學習過C++的STL庫的小伙伴都知道,C++已經貼心的為我們封裝好了現成的雙向循環鏈表:list, 拿來直接用就好了。 (沒接觸過不要緊, 文章最下面有詳細的list教學。) .
首先,輸入數據,壓入list, 第二步,判定K值,第三步,調用函數輸出。
第三步:代碼:
#include <iostream> #include <cstdio> #include <list>using namespace std ;int main() {list <int> l ;int n ; //倒數第n項 cin >> n ;int x ; //輸入的值 int num = 0 ; //計數器 while ( scanf("%d",&x) && x >= 0 ) {l.push_back(x) ; num++ ; } //如果不存在 if( num < n ) {cout << "NULL" ; return 0 ;}list <int>::iterator it ;it = l.end() ;it-- ;advance(it,-(n-1)) ;cout << *it ;return 0 ;}總結:比較水, 但是可裝13 優化的地方很多,比如我們很難想到用advance()這個函數去代替循環。再或者用num計數器代替 size()也可以省下很多時間。
附錄:list容器的用法:
常用聲明方法: list L ;
1.賦值:L.assign()
2.判定是否為空:L.empty() 空為1
3.計算大小:L.size() //目前存儲的空間
L.max_size() // 容器的最大容量 (容器也有大小,不是無窮的 比long long 小)
4.排序:sort() 對整型,浮點型,字符型進行排序 (升序) 還可以對結構體,容器排序。
壓入元素:L.push_back() ; L.push_front()
插入元素:L.insert(i,x) ; L.insert(i,n,x) L.insert(i,L.begin(),L.end())
刪除元素:L.pop_back() ; L.pop_front() L.erase(it) ;
特殊的1:移除元素:L.remove(x) ;
移除前:5 3 5 3 5
L.remove(3) ;
移除后:5 5 5
特殊的2:合并容器:L1.merge(L2) 把L2的所有值給L1 且升序排序
特殊的3:合并容器:L1.splice(L2) 把L2的所有值給L1 且不排序,只連接
特殊的4:因為list迭代器不像vector迭代器那樣靈活(因為二者存儲方式不同),因此用iterator中的advance函數: advance(it,5) :則輸出第六個函數
總結
以上是生活随笔為你收集整理的7-4 求链式线性表的倒数第K项(最佳解法)(List容器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dev C++ 运行后显示Failed
- 下一篇: 两个有序链表序列的交集 (20分)(最佳