剑指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; }};
阅读全文
0 0
- 剑指offer 试题61~66
- 剑指Offer试题总结
- 剑指offer 面试题
- 剑指offer面试题
- 剑指offer面试题总结
- 剑指offer面试题06
- 剑指offer面试题 04
- 剑指offer 面试题07
- 剑指offer面试题08
- 剑指offer面试题42
- 剑指offer面试题1
- 剑指offer面试题3
- 剑指offer面试题4
- 剑指offer面试题5
- 剑指offer面试题6
- 剑指offer面试题7
- 剑指offer面试题8
- 剑指offer面试题9
- Java 计算机图形学beizer生成以及升降阶
- springboot整合redis
- Spark算子[14]:top、takeOrdered 源码实例详解
- bashrc与profile理解
- 服务降级与熔断的区别
- 剑指offer 试题61~66
- MySQL中的insert ignore into, replace into等的一些用法
- C# 快速高效率复制对象另一种方式 表达式树
- surrogate loss function代理损失函数
- sqoop全量抽取postgresql数据
- mybatis bug 记录
- 【python】Threading快速使用和线程锁的理解及.join()用法详说
- JQurey事件绑定方法与区别
- springboot框架servlet容器tomcat、Jetty、undertow压测报告