题解 | #MP3光标位置#
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
#include <iostream> using namespace std; #include <list> #include <string> int main() { int num; string cmd; cin >> num >> cmd; int winp = 1; list<int> lst; for (int i = 1; i <= num; i++) { lst.push_back(i); } auto p = lst.begin(); auto beg = lst.begin(); auto end = lst.begin(); auto lstEnd = lst.end()--; for (int i = 0; i < 3; i++) { end++; } //cout << "p: " << *p << " beg: " << * beg << " end: " << * end << endl; for (int i = 0; i < cmd.size(); i++) { if (cmd[i] == 'U') { if (*p == *beg && *p != *lst.begin()) { beg--; end--; } else if (*p == *beg && *p == *lst.begin()) { //cout << "superU" << endl; for (int j = 0; j < 4; j++) { beg--; end--; } beg--; end--; p--; } p--; } else if (cmd[i] == 'D') { if (*p == *end && *p != *lstEnd) { beg++; end++; } else if (*p == *end && *p == *lstEnd) { //cout << "superD" << endl; for (int j = 0; j < 4; j++) { beg++; end++; } beg++; p++; end++; } p++; } //cout << "cmd: " << cmd[i] << " p: " << *p << " beg: " << * beg << " end: " << * // end << endl; } for (int i = 0; i < 4 && i < num; i++) { cout << *beg << " "; beg++; } cout << "\n" << *p << endl; }
C++的STL的list是双向循环链表,但是记住头尾都会遇到一个额外的迭代器可访问的区域,所以跨过边界的时候需要多加/减一次
利用双向循环的特性和头尾指针,可以实现题目所需的功能
最后有样例曲子少于4首的,记得特殊条件也要更改输出
这样的写的好处在于逻辑代码其实是兼容所有情况
华为机试刷题记录 文章被收录于专栏
记录一下手打代码的解题思路方便复习