复习结构体大小计算以及错题记录

📝复习下结构体的对齐规则

  • 每个成员变量都有一个对齐数,就是自己的大小(比如int就是4

    VS下默认是8,平台不同,默认值不同,Linux下是4

  • 对齐数=min(默认对齐数,成员变量的大小)

    比如默认对齐数是4,double类型的成员变量,那double的对齐数是min(4,8)==4

  • 最大对齐数=min(默认对齐数,对齐数的最大值)

    比如默认对齐数是4,成员变量对齐数最大值是8,那最大对齐数是min(4,8)==4

  • 成员变量要对齐到自身对齐数的整数倍

  • 结构体总大小是最大对齐数的整数倍

  • 嵌套结构体的对齐数就是嵌套的结构体的最大对齐数

由于是复习就不画图说明了,直接贴例子

📄验证对齐数的存在

#include<iostream>
using namespace std;

#pragma pack(4)//指定默认对齐数是4
struct A
{
	//测试double类型在默认值是4下的对齐数
	//按理论猜测在默认对齐数是4的时候,double类型的对齐数是4而不是8
	int a;//0-3 
	double b;//4-11
	double c;//12-19  
	int i;//20-23   如果假设成立大小应该是24

	//再假设double类型在默认对齐数是4的情况下对齐数是8(与理论违背)
	//  0-3 -> 8-15 -> 16-23 -> 24-27  结果应该是28
};
int main()
{
	cout << sizeof(A) << endl;
}

image-20220121122246075

📄验证最大对齐数的存在

#include<iostream>
using namespace std;

#pragma pack(4)//指定对齐数是4
struct A
{
	//测试double类型在默认值是4下的最大对齐数
	int a;//0-3 
	char b;//4    5-7
	double c;//8-15
	int i;//16-19   如果假设成立大小应该是20
	//如果最大对齐数是4,那结果就应该是20   
	//如果最大对齐数是8,拿结果就应该是24
};

int main()
{
	cout << sizeof(A) << endl;
}

image-20220121122827155

📝错题随笔记录

📄场景一:M转为N进制表示

题目链接:进制转换

  • 注意整数包括负数

N转M进制数没考虑负数一直没a😭

考虑后马上就a了…

🗡题解通过截图:

image-20220121123813420

思路:算出有几位数字,然后直接一直整除即可

比如9转为2进制 1001

由于9>8且9<16 所以肯定有四位数字(8=1000 16=10000)

9 / (2^3)==1 //最高位的数字 一共有四位数字,最高位肯定是2^3

9-(1*2^3)==1

1 / (2^2)==0 //次高位

1-(0*2^2)==1

1 / (2^1)==0 //次次高位

1 - (0*2^1) ==1

1 / (2^0)==1 //最低位

1 -(0*2^0)=0 //结束循环

//有点像填数字的过程,手动模拟一下即可理解

附上代码:

#include<stdio.h>
#include<math.h>
typedef long long ll;
int main()
{
	ll m, n;
	scanf("%lld%lld", &m, &n);
	if (m == 0)
	{
		printf("0\n");
	}
	if (m < 0)//处理负数
	{
		printf("-");
		m = -m;
	}
	int t = 0;
	long long tmp = 1;
	while (tmp <= m)//看一共有多少位
	{
		tmp = tmp*n;
		t++;
	}
	//有t位数
	char a[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
	while (t)
	{
		int x = m / pow((double)n, t - 1);
		printf("%c", a[x]);
		m -= x*pow((double)n, t - 1);
		t--;
	}
	printf("\n");
	return 0;
}

📄场景二:连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和 - 力扣(LeetCode) (leetcode-cn.com)

连续子数组指的是下标连续,而不是元素的值连续,之前理解错误一直错误😭

考虑后还是没a,因为一开始以为数组内不能有负数,会导致和减小

但是和最大子数组里可以包括负数,以负数为桥梁,连接起两边两个更大的正数

比如4 -1 2 1这个最大子数组,-1就充当了桥梁,不考虑-1最大值只是4,考虑-1最大值就是6

思路贪心,可以用dp写,本质上还是做决策,考虑当前数字放不放进子数组的问题

  1. 如果子数组加入数字X后得到的和比X更小,说明子数组可以选择更优的解法:以X为起点

比如 -1 2 子数组{-1} 加入2后得到的和为1 , 1<2 ,与其把2加入数组,不如直接抛弃得到的子数组{-1,2},做出建立子数组{2}的决策 因为数组{2}比{-1,2}是更优的解,可以确定起点

每步最优->得到全局最优,也是贪心思想

  1. 记录下每次得到的最大值比较,免得最优解被更新,作用是确定子数组的终点

比如 [4,-1,2,1,-5,4]中子数组{4,-1,2,1}的和是6得到最优,此时元素-5进行判断,6+(-5)得到和为1>-5符合不被抛弃的条件,此时不做处理,最优解就会被更新成1,为了防止这种情况,记录下上一次的最大值与其比较(即6与1比较,6更大,不被更新)

难点在于第一步的最优决策,第二步的记录最大值大家应该都会

#include<iostream>
#include<algorithm>
using namespace std;
int maxSubArray(int* nums, int numsSize){
	//ans=max(ans+nums[i],nums[i])
	if (numsSize == 1)
	{
		return nums[0];
	}
	int ans = nums[0];
	int mmax = nums[0];
	for (int i = 1; i < numsSize; i++)
	{
		ans = max(ans + nums[i], nums[i]);
		mmax = max(ans, mmax);
	}
	return mmax;
}

int main()
{
	int nums[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
	int x=maxSubArray(nums, sizeof(nums) / sizeof(int));
	printf("%d\n", x);
}

🗡题解通过截图:

image-20220121141730710

}

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢乙醇的四氯化碳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值