
1. feof()函数的定义:int feof(FILE *stream);
该函数的作用是判断是否读到了文件结尾。检测到文件结束标识返回1,否则返回0。
2. 声明类指针(对象)由于new分配了内存空间,所以会调用构造函数;delete时调用析构函数。
3. %取余运算符只能用于整形;A%B——A、B都必须为int类型。
4. 使用C语言将一个1G字节的字符数组从头到尾全部设置为字’A’,在一台典型的当代PC上,需要花费的CPU时间的数量级最接近:1s
执行1条语句约1ns即10的-9次方秒,1G=1024M=1024*1024k=1024*1024*1024byte,每次赋值1byte都要执行一次语句,故至少花费1024*1024*1024*10^-9=1.073741824s
5. 不能对一个指针使用多次 delete!因为 delete 以后,此内存已经被收回,可能被分配用于其它变量,因此再次 delete 导致其它的数据被非法修改,这是一种不确定的行为。
delete 用于释放 new 创建的内存,delete [] 用于释放 new 创建的数组内存。delete 后面只能跟上 new 返回的指针变量。
※ 使用 delete 释放对象内存时会调用对象的析构函数!
6. include
include "file" //先在当前目录中搜索文件,然后再到默认搜索目录中搜寻。
因此:语句#include< stdlib.h >是正确的,而且程序编译速度比#include “stdlib.h”要快。
7. 任何一个数的二进制表达与1相与就可以知道其最后一位为0/1。
只有当数据集比较少且数字都较小才可以(推荐)使用重新定义一个数组a[10000]用 a[arr[i]]++; 来对应下标对其赋初值记录某个数字出现了几次。但当数字过大,查找的for()循环耗费时间过多且数组开辟过大~效率过低。
建议采用二进制位运算解决,将题目中条件出现k次利用上。
任何二进制数&1就可以知道其最后一位是1还是0,再通过一位一位右移运算就可以知道每一位是1还是0。最终把数组每个数每一位的1加起来无法%k==0的一位就是对应出现一次的那个数那一位为1。(代码如下)
//给定一个长度为 n 的整型数组 arr 和一个整数 k(k > 1) 。
//已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
//请返回只出现了 1 次的数。
static int val = 0;
int foundOnceNumber(int* arr, int arrLen, int k)
{
for (int i = 0; i < 32; i++) //外层循环是对该数每一位进行循环
{
int cnt = 0; //记录该数组中所有数该位1的总和
for (int j = 0; j < arrLen; j++)
{
//任何二进制数&1就可以知道其最后一位!是1还是0。
cnt += (arr[j] >> i) & 1; //>>i右移i位指将要比较的位移到最后一位来与1相与看其为0/1
}
val += (cnt % k) << i; //循环完二进制的1位后,cnt%k==0代表只出现了一次的数该位为0;cnt%k==1代表只出现了一次的数该位为1。
//<欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)