此题助我进入腾讯的实习,但是当时是参考书上的,今天就来回顾了一下老朋友。欣慰的是这是62题,在腾讯实习提前批笔试之前我就基本刷完了剑指。只要我想做的,就能做好;只要准备了,就比不准备好得多。
书上用的list,主要用了erase()函数和迭代器的知识
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<1 || m<1) return -1;
list<int> numbers;
for(int i=0; i<n; i++) {
numbers.push_back(i);
}
list<int>::iterator current = numbers.begin();
while(numbers.size()>1) {
for(int i=0; i<m-1; i++) { // 走m-1步
current++;
if(current == numbers.end()) { // end()指向最后一项的下一个
current = numbers.begin();
}
}
list<int>::iterator next = ++current; // current+1不通过编译
current--;
numbers.erase(current);
if(next == numbers.end()) {
next = numbers.begin();
}
current=next;
}
return *current;
}
};
对list不了解,照书写完之后想用vector。list迭代器没有+操作符,看vector的迭代器可以+1,不用自增再自减,于是改成vector,发现不通过,提示溢出什么的。仅仅将list替换成vector,在xcode中运行,结果不对。于是单步调试,发现vector erase之后,current和next迭代器都神奇地自己加了1,按照这个脾气修改代码后通过:
class Solution {
public:
int LastRemaining_Solution(int n, int m) {
if(n<1 || m<1) return -1;
vector<int> numbers;
for(int i=0; i<n; i++) {
numbers.push_back(i);
}
vector<int>::iterator current = numbers.begin();
while(numbers.size()>1) {
for(int i=0; i<m-1; i++) { // 走m-1步
current++;
if(current == numbers.end()) { // end()指向最后一项的下一个
current = numbers.begin();
}
}
numbers.erase(current);
if(current == numbers.end()) {
current = numbers.begin();
}
}
return *current;
}
};
另外查了list和vector的区别,也就是这个题为什么用list好一些 https://blog.csdn.net/c_shell_python/article/details/88753515
list底层是双向链表,适合此题。
表扬自己这种一定要探究到底的精神。