两道baidu试题

1、简述:

n个空间,存放a到a+n-1的数,位置随机且数字不重,a为正且未知,现在第一个空间的数被误设置为-1。 

说明:已经知道被修改的数不是最小的。

例子:n=6,a=2,原始的串为5,3,7,6,2,4。现在被别人修改为-1,3,7,6,2,4。现在希望找到5。

思路:充分利用等差数列性质。

法一:开一全0的新数组,先找出被修改后的数中的最小值,然后让数组中的所有数依次减去这个最小值,所得的值作为另一个新数组的下标,将所有下标大于0的数组值赋为1,此时新数组中值为0的那个数就是被修改的数。

法二:找出被修改的数中的最小值和最大值,然后即可用等差数列求和公式求出所有数的和;再将空间中除-1外的所有数相加求和,将两种方法求得的和相比较,若相等则说明被修改的是最大值,若不等则差值即为被修改的数

法三:将空间中所有数从小到大排序,然后从-1之后挨个后数减前数,若差值大于1说明相减的两数间有被修改的数,若差值均等于1,说明被修改的是最大值。

程序:

#include <string.h>
#include <iostream.h>

unsigned int find_lost1(const int * source, const int length)//方法1求解
{
    int i,n;
 int *temp = new int[length];
 memset(temp, 0, sizeof(int)*length);//将新数组初值全赋为0
 int min, index;
 
 for(i=0; i<length; i++)//任找一个非-1的数假设为最小值
  if(source[i]!=-1)
  {
   min=source[i];
   break;
  }
  
  for(i=0; i<length; i++)//找出数组中的最小值
  {
   if(min>source[i] && source[i]!=-1)
    min=source[i];
  }
  
  for(i=0; i<length; i++)
  {
   index = source[i]-min;//将数组中的所有数分别减去最小值后所得的值作为新数组下标
   if(index>=0)
    temp[index]=1;//将新数组中下标大于0的元素赋值为1
  }
  
  for(i=0; i<length; i++)
  {
   if(temp[i]==0)//原数组中被替换的数以-1代,所以temp数组中对应值保持0不变
   {
    delete []temp;
    n=i+min;//此时的下标值加上最小值即为被替换的数
   }
  }
  return n;
}

unsigned int find_lost2(const int * source, const int length)//方法2求解
{
 int i, min, max, sum1=0, sum2;
 
 if(source[0]!=-1)//任找一个非-1的数假设为最小值和最大值
  min=max=source[0];
 else
        min=max=source[1];
 
 for(i=0; i<length; i++)
 {
        if(source[i]!=-1)
  {
   if(min>source[i]) min=source[i];//找出数组中的最小值
            if(max<source[i]) max=source[i];//找出数组中的最大值
            sum1+=source[i];//将数组中非-1的值加起来求和(即去除被替换数的其他所有数之和)
  }  
 }
 
 sum2 = (max-min+1)*(min+max)/2;//用等差数列求和公式求和
 if( sum1 == sum2)//两种方法所求的和相等,说明被替换数是原数组中的最大值
  return (max+1);
 else
  return (sum2-sum1);//若两种方法所求的和不相等,则相减得被替换的数
}

unsigned int find_lost3(const int * source, const int length)//方法3求解
{
 int i,j,temp;
 int *source1=new int[length];
 memcpy(source1,source,length*sizeof(int));//因为形参中的const无法对原数组中数据直接排序,所以将其拷贝到一个新数组中
 for(i=0;i<length-1;i++)//在新数组中将原数组中数据按冒泡法由小到大排序
 {
  for(j=0;j<length-i-1;j++)
  {
   if (source1[j]>source1[j+1])
   {
    temp=source1[j];
    source1[j]=source1[j+1];
    source1[j+1]=temp;
   }
  }
 }
 /*从非-1的数开始,后数减前数,因为是等差数列,差值必为1,若不为1则两数之间是被替换的数*/
 temp=0;
 for (i=1,j=2;i<length-1,j<length;i++,j++)//因为-1在首位,所以下标从1开始
 {
  if(source1[j]-source1[i]!=1)
  {
   temp=source1[i]+1;//前数加上等差1即为被替换的数
   break;
  }  
 }
 if(temp==0)//temp为0说明被替换的数是原数组中的最大值
  temp=source1[length-1]+1;
 return temp;
}

void main()
{  
 int a[]={4, 3, 7, 8, 5, -1, 2};
 int loc;
 loc=find_lost1(a, sizeof(a)/sizeof(a[0]));
 cout<<"方法1,丢失的数是:"<<loc<<endl;
 loc=find_lost2(a, sizeof(a)/sizeof(a[0]));
 cout<<"方法2,丢失的数是:"<<loc<<endl;
 loc=find_lost3(a, sizeof(a)/sizeof(a[0]));
 cout<<"方法3,丢失的数是:"<<loc<<endl;
}

2、简述:给定一个c++代码文件,输出去掉注释后的文件内容。

说明:注释可以使用“/*    */”和“//”,其语义为c++语义。注意处理两种注释混用的情况。

程序:

#include <string.h>
#include <stdio.h>
#include <iostream.h>

void foo(const char *src, char *buf, unsigned int buf_len)
{
 int i=0, j=0;
 int len = strlen(src);
 while(i<len && j<buf_len)
 {
  if(src[i]=='/' && (i+1)<len && src[i+1]=='/')//判断是否为'//'注释符
  {
   i+=2;//若是'//'注释符则定位到其后
   while(src[i]!='/n') i++;//若没遇到回车则一直往后读
   i++;//跳过回车,定位到其后
  }
  else
   if( src[i]=='/' && (i+1)<len && src[i+1]=='*')//判断是否为'/*'注释符
   {
    i+=2;//若是'/*'注释符则定位到其后
    while(src[i]!='*' || ( (i+1)<len && src[i+1]!='/'))
     i++;//若没遇到下一个'*/'注释符则一直往后读
    i+=2;//跳过'*/'注释符,定位到其后
   }
   else
   {
    buf[j++] = src[i++];//将去除注释符后的内容拷贝到缓冲区中
   }
 }
}

void main()

 char path[]={"c://1.cpp"};
 FILE *file;
 if( (file=fopen(path, "r+")) != NULL)
 {
  int len;//file 的长度
  
  fseek(file, 0L, SEEK_END);
  len=ftell(file);
        fseek(file,0,SEEK_SET);
       
        char *src=new char[len+1];
  char *buf=new char[len+1];
  memset(src,0,len+1);
  memset(buf,0,len+1);
       
  if(!feof(file))
   fread(src,len,sizeof(char),file);
        fclose(file);
  foo(src,buf,len);
  cout<<src<<endl;
  cout<<buf<<endl;
  delete []src;
  delete []buf;  
 }
}

 
【第1题】4 1. (已核对)依据国家标准/T20274《信息系统安全保障评估框架》,信息系统安全目标 (ISST)中,安全保障目的指的是: (单选) 1、 信息系统安全保障目的 2、 环境安全保障目的 3、 信息系统安全保障目的和环境安全保障目的 4、 信息系统整体安全保障目的、管理安全保障目的、技术安全保障目的和工程安全保障 目的 解析: 解释:GB/T 20274信息系统保障评估框架从管理、技术、工程和总体方面进行评估。 【第2题】2 2. (已核对)以下哪一项是数据完整性得到保护的例子? (单选) 1、 某网站在访问量突然增加时对用户连接数量进行了限制,保证已登录的用户可以完成 操作 2、 在提款过程中ATM终端发生故障,银行业务系统及时对该用户的账户余额进行了冲正 操作 3、 某网管系统具有严格的审计功能,可以确定哪个管理员在何时对核心交换机进行了什 么操作 4、 李先生在每天下班前将重要文件锁在档案室的保密柜中,使伪装成清洁工的商业间谍 无法查看 解析: 解释:A为可用性,B为完整性,C是抗抵赖,D是保密性。冲正是完整性纠正措施,是 Clark-Wilson模型的应用,解决数据变化过程的完整性。 【第3题】2 3. (已核对)进入21世纪以来,信息安全成为世界各国安全战略关注的重点,纷纷制定 并颁布网络空间安全战略,但各国历史、国情和文化不同,网络空间安全战略的内容也 各不相同,以下说法不正确的是: (单选) 1、 与国家安全、社会稳定和民生密切相关的关键基础设施是各国安全保障的重点 2、 美国尚未设立中央政府级的专门机构处理网络信息安全问题,信息安全管理职能由不 同政府部门的多个机构共同承担 3、 各国普遍重视信息安全事件的应急响应和处理 4、 在网络安全战略中,各国均强调加强政府管理力度,充分利用社会资源,发挥政府与 企业之间的合作关系 解析: 解释:美国已经设立中央政府级的专门机构。 【第4题】4 4. (已核对)与PDR模型相比,P2DR模型多了哪一个环节? (单选) 1、 防护 2、 检测 3、 反应 4、 策略 解析: 解释:PPDR是指策略、保护、检测和反应(或响应)。PPDR比PDR多策略。 ---自身考试亲测真题,覆盖率80%以上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值