剑指offer 试题61~66

来源:互联网 发布:数据库sqlite怎么用 编辑:程序博客网 时间:2024/06/01 07:45

试题61:扑克牌中的顺子

枚举起点,检查从起点开始的五张牌,要求这五张牌任意一张的数量不能超过1,超过1肯定不是顺子。然后统计缺失的牌,如果缺失的牌数小于大王小王的数量,则是顺子,否则不是顺子

class Solution {public:    bool IsContinuous( vector<int> numbers ) {        const int N = 14;        int num[N];        memset(num, 0, sizeof num);        for(int i = 0; i < numbers.size(); ++i)            ++num[numbers[i]];        bool ans = false;        for(int i = 1; i <= 9; ++i)        {            int temp = 0;            for(int j = i; j < i+5; ++j)            {                if(num[j] == 0)                    ++temp;                else if(num[j] > 1)                {                    temp = -1;                    break;                }            }            if(temp >= 0 && temp <= 4 && num[0] >= temp)            {                ans = true;                break;            }        }        return ans;    }};

试题62:圆圈中最后剩下的数字

其实就是约瑟夫环问题
模拟:

//效率很渣#include <bits/stdc++.h>using namespace std;const int N = 1000 + 10;int a[N];int main(){    int n, m;    scanf("%d%d", &n, &m);    memset(a, 0, sizeof a);    int num = n, cnt = 0;//num记录圆圈中剩余多少人,cnt记录当前位置的报数    while(num != 1)    {        for(int i = 0; i < n; ++i)        {            if(a[i] == 0)                ++cnt;            if(cnt == m)            {                cnt = 0;                a[i] = 1;                --num;            }        }    }    int ans = -1;    for(int i = 0; i < n; ++i)        if(a[i] == 0)            ans = i;    printf("%d\n", ans);    return 0;}

公式:

class Solution{public:    int LastRemaining(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;    }};

试题63:股票的最大利润

牛客上没有这道题,自己写一下

class Solution {public:    int getMaxProfit(vector<int> price) {        int ans = 0;        int minval = INT_MAX;        for(int i = 0; i < price.size(); ++i)        {            if(i == 0)                minval = price[i];            else            {                ans = max(ans, price[i] - minval);                minval = min(minval, price[i]);            }        }        return ans;    }};

试题64:求1+2+…+n

用&&运算的短路性质

class Solution {public:    int Sum_Solution(int n) {        int ans = n;        ans && (ans += Sum_Solution(n-1));        return ans;    }};

试题65:不用加减乘除法做加法

思路很巧妙

class Solution {public:    int Add(int num1, int num2)    {        int sum, carry;        while(num2 != 0)        {            sum = num1 ^ num2;            carry = (num1 & num2) << 1;            num1 = sum;            num2 = carry;        }        return num1;    }};

试题66:构建乘积数组

class Solution {public:    vector<int> multiply(const vector<int>& A) {        vector<int> B;        if(A.size() <= 1)            return B;        vector<int> C(A.size()), D(A.size());        for(int i = 0; i < A.size(); ++i)        {            if(i == 0)                C[i] = A[i];            else                C[i] = C[i-1] * A[i];        }        for(int i = A.size()-1; i >= 0; --i)        {            if(i == A.size()-1)                D[i] = A[i];            else                D[i] = D[i+1] * A[i];        }        for(int i = 0; i < A.size(); ++i)        {            if(i == 0)                B.emplace_back(D[i+1]);            else if(i == A.size()-1)                B.emplace_back(C[i-1]);            else                B.emplace_back(C[i-1] * D[i+1]);        }        return B;    }};
原创粉丝点击