A。现在有若干个 2 的整数次幂的数,想知道他们求和后的数转换为二进制后,有多少个 1?
分析:
本题有多种做法,开一个标记数组 表示给定的 n个数中为2的i次幂的数的个数,然后模拟二进制的加法进位,例如:假设有3个数为2的4次方,则他们相加后后一项变为3 ,因为二进制 后每一个数的要么为0 ,要么为1,所以3将 变为二进制后为11 ,然后相加后变成1100 ,以此类推,从 最后一位往前进位相加,全部处理完成后,统计数组中的1的个数即为最终答案,注意 数组的大 小,由于有进位操作,所以刚好开100000是过不去本题的。
反思:1.数组能开多大就开多大!
2.灵活运用标记数组,否则很多题目会超限。
3.题意一定得读好,建议左右双开一个窗口,边写边看题意。
E
题意:给一个01字符串,选择连续的两个字符反转,问能否变成完全一样的
分析:首先统计出字符串中 和 的个数,若有一个数量为偶数,则一定能变成一样的,将那两个偶
数变换成奇数一样的即可,若0的个数和1的个数都是奇数的时候,则不论怎么操作,都会剩下1个是无 法变换的,所以,统计完0的个数和1的个数后,判断只有这两个个数均为奇数的时候,是不可能的,其 余情况均是可以的
分析:数学分析能力也是很重要的一项能力
F
题意:给长度为 的序列,可以选择任意长度的子序列(可以不连续),要求选择的序列中最大值
和最小值的差值不能超过 ,求最长的可能序列
做法
:
使用标记的思想,用 数组记录每一个数出现的次数,然后从0开始,去计算i到i + k中有多
少个数,每一次计算直接跑k的循环即可,取计算中的最大值即为最长可能的子序列
做法
:
用sort将数组排序后,使用双指针扫描即可,扫描的时候,若发现右侧指针的数与左侧指针
的数相差大于k,则左指针
++
,否则右指针
++
,然后边移动比计算长度即可,此方法复杂度最低,有兴 趣的同学可以学一下双指针的线性做法
分析:仍然是灵活使用标记数组
G
题意:找到1到n中有多少个完美数字,完美数字满足x = a^2+b^3+c^4,其中a, b, c均为素数。
分析:首先 !预处理! (打表)。然后只需要遍历这些素数即可。然后暴力寻找a,b,c,即可
反思:素数(数列)问题一律考虑打表