主题:
日常学习记录,包括
- 算法题:斐波那契数列
- 算法题:带重复值的二叉查找
- 结构体的内存对齐
代码:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
struct A {
char c = 'r';
short s = 12;
int i = 100;
//int a = 12;
void* v = NULL;
};
int main()
{
//--------------斐波那契数列-----------------
//输入一个数n,输出这个下标对应得数字
//基本思路:设置两个int变量,来模拟一前一后两个数,然后一步一步向后“跳”,这个
//跳要注意,基本思路是先将front原本的值赋值给back,然后front进行赋值为back和
//front的和。但是腰注意,应该先把back或者front的数值先存起来,不然的话,向前推进
//要求的都是原来的值,那么不管哪个先来,另外一个都会收到影响。
/*
int Fibonacci(int n) {
int front = 1;
int back = 0;
int i=0;
int buff;
while(i<n)
{
buff = front;
front = back+front;
back = buff;
i++;
}
return back;
}
*/
//--------------------有重复数字的升序数组的二叉查找(非递归实现)-------------
//要求给出最左边的那个数字的编号,比如 1 2 3 3 4 6 种查找3,需要给出2 而不是3
//实现思路:当查找到mid相等的元素的时候,不是退出,而是将mid入栈,进行记录,然后
//继续 向左边查找(right = mid-1).
//注意最外层循环的判断条件,为left<=right.因为这样可以避免right ”坐“ 到target
//但是由于left和right相当就直接退出的情况。(内部使用left = mid+1 right = mid-1)
//而且最终也还是会因为mid相等,然后移动right,最终出去的情况。
/*
int search(vector<int>& nums, int target) {
// write code here
int left=0;
int right = nums.size()-1;
int mid = (left+right)/2;
stack<int> s;
while(left<=right)
{
if(nums[mid]==target)
{
s.push(mid);
right = mid-1;
}
else if(nums[mid]>target)
{
right = mid-1;
}
else{
left = mid+1;
}
mid = (left+right)/2;
}
if(s.empty()==0)
{
return s.top();
}
else{
return -1;
}
}
*/
//-------------------------结构体的内存对齐------------------------
//结构体成员自身对齐时,存放的地址为min{有效对齐值为自身对齐值, 指定对齐值} 的最小整数倍的地址处.
//注:自身对齐值:结构体变量里每个成员的自身大小
//注:指定对齐值:有宏 #pragma pack(N) 指定的值,这里面的 N一定是2的幂次方.如1,2,4,8,16等.如果没有通过宏那么在32位Linux主机上默认指定对齐值为4,64位的默认对齐值为8,AMR CPU默认指定对齐值为8;
//注:有效对齐值:结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中 较小的一个.
//找到有效对齐值之后,需要把数据放在后面,放在是有效对其值的整数倍的地方。
//
cout<<sizeof(A)<<endl;
return 0;
}