int fib(int n) {
if(n==0) return 0;
if(n==1||n==2) return 1;
int a=0,b=1,c=0;
for(int i=0;i<n;i++){
a=b,b=c;
c=(a+b)%1000000007;
}
return c;
}
10
int numWays(int n) {
int a=0,b=1,c=1;//注意于fib的区别
for(int i=0;i<n;++i){
a=b,b=c;
c=(a+b)%1000000007;
}
return b;//注意于fib的区别
}
-------------
链表
ListNode* reverseList(ListNode* head) {
ListNode* pre=nullptr;
ListNode* cur=head;
ListNode* next=nullptr;
while(cur){
next=cur->next;//保存
cur->next=pre;//反转
pre=cur;//更新头节点
cur=next;//移向下一个
}
return pre;//pre才是头节点
}
--------------
11 二分查找
int minArray(vector<int>& numbers) {
//二分查找
//二分之只能处理有序数组,这里是个旋转数组,变形的递增
int low=0;
int high=numbers.size()-1;
while(low<high)
{
int mid = low + (high-low)/2;
if(numbers[mid]<numbers[high]){
high = mid;//我们在找最小值
}
else if(numbers[mid]>numbers[high]){
low = mid+1;//前面的肯定是递增,都比high高只能往后找
}
else{
high -= 1;
}
}
return numbers[low];//找的最小值
}
O(log n)
O(1)
-------------------
21 排序
vector<int> exchange(vector<int>& nums) {
int L=0;
int R=nums.size()-1;
while(L<R){
while(R>=0&&nums[R]%2==0) --R;//从右边找奇数
while(L<nums.size()&&nums[L]%2!=0) ++L;//从左边找偶数
//我们想要奇数在左边
if(L<R) swap(nums[R--],nums[L++]);
}
return nums;
}
----------------------
15 没啥东西,死记硬背
int hammingWeight(uint32_t n) {
int ret=0;
while(n!=0){
n=n&(n-1);
ret++;
}
return ret;
}
/*
15思路:一个不为零的数-1后,二进制原来最右边的1->0,其后所有0变为1,1保持不变。
–->把一个整数-1,在和原来做and运算,会把整数最右的一个1变成0
–->可以重复多少次,就有几个1
*/