<剑指Offer>面试题62: 圆圈中最后剩下的数字

2019-02-26  本文已影响0人  cb_guo

题目描述

题目解读

代码

#include<iostream>
#include<list>
using namespace std;

class Solution {
public:
    int LastRemaining_Solution(int n, int m){
        if( n < 1 || m < 1){
            return -1;
        }

        list<int> circle;
        for(int i=0; i < n; i++){
            circle.push_back(i);
        }

        list<int>::iterator current = circle.begin();
        list<int>::iterator next;
        while(circle.size() > 1){

            // 往后读 m-1 位
            for(int k=1; k < m; k++){
                current ++;
                if(current == circle.end()){
                    current = circle.begin();
                }
            }

            current ++;
            next = current;
            if(next == circle.end()){
                next = circle.begin();
            }
            current --;
            circle.erase(current);
            current = next;
        }
        return *current;
    }
};

int main(){
    Solution ss;
    
    int n = 5;
    int m = 3;
    int result = ss.LastRemaining_Solution(n, m);
    cout<<result<<endl;
}
#include<iostream>
#include<list>
using namespace std;

class Solution {
public:
    int LastRemaining_Solution(int n, int m){
        if( n < 1 || m < 1){
            return -1;
        }

        int last = 0;
        for(int i=2; i <= n; i++){
            last = (last + m)%i;
        }
        return last;
    }
};

int main(){
    Solution ss;
    
    int n = 5;
    int m = 3;
    int result = ss.LastRemaining_Solution(n, m);
    cout<<result<<endl;
}

总结展望

上一篇 下一篇

猜你喜欢

热点阅读