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