C++笔试题

掷N+1枚硬币正面朝上比N枚硬币正面朝上多的概率是多少?具体过程怎么算呢?

类似于两个人A,B仍硬币,A扔n次,B扔n+1次,A x次正面朝上,B y次正面朝上,问x>y的概率是多少?也就是反面朝上比B比A多?
我做这道题目的方法是:如果甲先投掷N次。乙也N次。假设甲比乙多的概率为X.那么乙比甲多的概率也是X.一样多的概率则为1-2X.然后甲在投掷一次出现正面的概率为1/2。所以综合甲在投掷一次比乙多的概率计算方法则为:X*1+(1-2X)*1/2+X*0=1/2..懂了吗
另外一种解释:
设A表示事件掷N+1枚硬币正面朝上比N枚硬币正面朝上多B表示事件掷N+1枚硬币反面朝上比N枚硬币反面朝上多显然P(A)=P(B)另一方面A∪B显然是全集,因为掷N+1枚硬币要么正面朝上比掷N枚多,要么反面朝上多,二者至少一个成立A与B又是互斥的,否则正面朝上的要多,反面朝上的也要多,总次数就不止多一次了于是P(A)+P(B)=1所以P(A)=P(B)=1/2
----------------------------------
在一个二维整数数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

方案1;
思路就是,从矩阵的最右上角的元素开始扫描a[i][j],如果要查找的数n小于该元素,则让i--,即往左移动一个数据再比较。如果n大于该数,则让j++,让原来的数往下移动一个数接着比较。 这里的设计思路就是充分利用了,数组横向纵向都递增的规律。而且巧妙的,一次只改变行数或列数,对应的列数或行数保持不变来进行搜索。
<SPAN style="FONT-SIZE: 18px">#include  <iostream>
using namespace std;

#define N 10
#define M 10
int main()
{
 int a[N][M];
 int n;
 int i = 0, j = M-1;
 while(i<N && j>=0)
 {
  if(n < a[i][j])
   j--;
  else if(n > a[i][j])
   i++;
  else
  {
   cout<<"已找到!i = "<<i<<"j = "<<j<<endl;
      return 0;
  }
 }
 return -1; //表示未找到

}</SPAN>
验证:
#include <iostream>
 
using namespace std;
#define N 1024
int a[N][N]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int main(int argc,char *argv[])
{
    int m = 4,n = 4,t = 6,r,c; 
    r = 0;
    c = n - 1;
    bool find = false;
    while((r < m) && (c >= 0))
    {
        if(t == a[r][c])
        {
            find = true;
            break;
        }
        else
            if(t < a[r][c])
                c--;
            else
                r++;
    }
    printf("%d:",a[r][c]);
    puts(find?"存在":"不存在");
    return 0;
}
--------------------
有100个黑球和100个白球放在一个不透明的盒子里,每次从盒子里随即取出两个球,如果两个球颜色相同则另外拿一个黑球放回盒内,取出来的两个球不放回。如果颜色不相同则放回一个白球。你可以假设用于放回盒子的球有无限个。问最后剩下一个球是黑球的概率。(答案用百分数表示)

对于每一次取球共有3中情况。1、取走两个白球,补充1个黑球,结果:白球少两个;2、取走两个黑球,补充1个黑球,结果:白球数量不变;3、取走一黑一白,补充1个白球,结果:白球数量不变。所以白球的变化只能是减少偶数个或是不变,因为给出的条件是100个白球,所以最后不可能剩1个白球,所以最后1个球是黑球的概率为100%
--------------------------------------
有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。

设这个整数数组是a1,a2,...,an
构造数组B=(b1,b2,...,bn-1)
b1 = a1-a2,
b2 = a2-a3,
b3 = a3-a4,
...
bn-1 = an-1 - an

那么原数组中,任意两整数之差ai-aj(1<=i,j<=n)可以表示成
B中第i个到第j-1个元素的连续求和

例如b2+b3+b4 = (a2-a3) + (a3-a4) + (a4-a5) = a2-a5

O(n)构造出B序列后

用类似“最大子段和”算法求“两两之差最小绝对值”
解释1---------------------
原来求“最大子段和”
Int MaxSubsequenceSum(const int A[], int N)
{
       int ThisSum, MaxSum, j;
       ThisSum = MaxSum = 0;
       For(j=0; j < N; j++)
       {
             ThisSum += A[j];
             If (ThisSum > MaxSum)
                     MaxSum = ThisSum;
              Else if(ThisSum < 0)
                     ThisSum = 0;
      }
      return MaxSum;
}

而这个算法的关键是利用如下事实:
如果前面的子串和是负的,则一定不要把前面的字串考虑进去。是这样的
如果后面的子串和是负的,则一定不要把后面的字串考虑进去。
而用MaxSum永远记录但前遇到的最大字串。

现在的目的是让这个数字和尽可能的绝对值小,无论前面子串的值是正的还是负的,都不能简单判断。

C++ sort函数用法
---------------------------
原型:
template<class RanIt>
void sort(RanIt first, RanIt last); //--> 1)
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr); //--> 2)
.默认的sort函数是按升序排。对应于1)
sort(a,a+n);   //两个参数分别为待排序数组的首地址和尾地址
2.可以自己写一个cmp函数,按特定意图进行排序。对应于2)
例如:
int cmp( const int &a, const int &b ){
    if( a > b )
       return 1;
    else
       return 0;
}
sort(a,a+n,cmp);
是对数组a降序排序
又如:
int cmp( const POINT &a, const POINT &b ){
    if( a.x < b.x )
       return 1;
    else
       if( a.x == b.x ){
          if( a.y < b.y )
             return 1;
          else
             return 0;
        }
       else
          return 0;
}
sort(a,a+n,cmp);
是先按x升序排序,若x值相等则按y升序排


与此类似的还有C中的qsort,以下同附上qsort的使用方法:
#include <stdlib.h>
         格式 qsort(array_name,data_number,sizeof(data_type),compare_function_name)       (void*)bsearch (pointer_to_key_word,array_name,find_number,
sizeof(data_type),compare_function_name)
         e.g.
         int Cmp(const void*a,const void *b)
{
                  int*pa=(int*)a,*pb=(int*)b;
                  if(*pa>*pb) return 1;
             else if (*pa==*pb)    return 0;
else   return -1;
}
qsort(data,N,sizeof(int),Cmp);        // 对int型数组进行快速排序(非降序排列)

------------------------------
就是运行一些和CMD命令相同的命令比如我们打开cmd窗口是
开始-运行-cmd那么在system("cmd");
效果一样我们查看用户是 net user
那么在system函数下就用  system("net user");
system(“cls”);可以实现清屏处理

-----------------------
#include <conio.h>
char ch;
printf("Input a character:");
ch = getch();
CH=GETCHAR();
printf(" You input a '%c' ", ch);
getch()的作用就是在屏幕上输入一个字符,但是不会显示,用一个字符变量来接收。。
getchar()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCⅡ码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.
-----------------------------------

C++中为什么有人喜欢用引用作为形参???
1、引用是地址传值,作为引用的形参数值被修改的同时,也修改了对应实参的值。 你不用引用当然可以,只是实参的值不会随着形参被修改。
2、引用还有另外一个作用,声明这个变量的时候不会浪费额外的内存空间,对引用的形参的操作实际就是对实参的操作。
为了避免使用指针。
3、可以修改你传进去的东西,虽然指针也可以,但是由于C的指针存在太多的问题,所以C++引入了引用这样的东西在初学到c++的时候,你应该向十字军一样勇猛的使用引用,然后再去慢慢体会何时该使用!
4、引用可以看成是被引用对象的另一个名字,他不格外占用空间。效率高,却和原对象有相同的效果。传引用比传指针(你需要为指针分配空间)或原对象(你需要重新定义分配对象)不知高多少倍,效果却和指针的一样(传的也是地址)
5、使用引用做形参,可以直接访问实参对象,并改变实参内容,而不是将实参复制给形参,所以在大数据传递时,用引用做形参可以提高效率。


-------------------------------------
数组后面的数减去前面的数的差最大???
题目是一个人知道未来n天的每天股票的价格,请你给出一个算法,使得这个人从哪天买入,哪天卖出能获得最大的收益。
----------------------

第一道题两个有序的数组,如何找出两个数组合并后的第K大的数

使用二分法的迭代方式,思路很好、、、就是最后屏幕一闪而过也没看到结果,有点遗憾。
#include <cstdlib>
#include <iostream>

using namespace std;

int find(int a[],int ahead, int atail,int b[],int bhead,int btail, int k)
{
    
     //head从0开始,tail是实际元素数-1;
     int amid=(ahead+atail)/2;
     int bmid=(bhead+btail)/2;
     int halflen=atail-ahead+1+btail-bhead+1;
     
     if(a[amid]<b[bmid])
              {          if(k<halflen)
                        {
                              return find(a,ahead,atail,b,bhead,bmid-1,k);       
                                      }
                        else
                        {
                            return find(a,amid+1,atail,b,bhead,btail,k-(amid-ahead+1));
                            }
              }
     else
         {
              if(k<halflen)
              {
                           return find(a,ahead,amid-1,b,bhead,btail,k);
                           }
             
              else
              {
                           return find(a,ahead,atail,b,bmid+1,btail,k-(bmid-bhead+1));
                  }
     }
}
int main(int argc, char *argv[])
{
    int a[]={1,2,2,5,7,8};
    int b[]={3,4,8,9,10};
    int ahead=0;
    int atail=sizeof(a)/sizeof(a[0])-1;
    int lena=atail-ahead+1;
   
    int bhead=0;
    int btail=sizeof(b)/sizeof(b[0])-1;
    int lenb=btail-bhead+1;
 /*   for(int i=1;i<=lena+lenb;++i)
    {
            cout<<"第"<<i<<"个数是:"<<find(a,ahead,atail,b,bhead,btail,i)<<endl;
  
            }
   */
    int k=10;
   
    //cout<<"第"<<k<<"个数是:"<<find(a,ahead,atail,b,bhead,btail,k)<<endl;
    int res=find(a,ahead,atail,b,bhead,btail,k);
    cout<<res<<endl;
    system("PAUSE");
   
    return EXIT_SUCCESS;
}

------------------------------------------
文件中数据读入到内存中
int a[100];
ifstream if=("demo.txt");
int i=0;
while(!if.eof())
{if>>a[i++];}


-----------------------------------------
找出给定的数在数组中出现的次数

1.线性搜索,O(n)
2.二分查找所有,O(n+s),s是要找的数出现的次数
3.二分查找第一次出现和最后一次出现,O(logn)

--------------------------------------------------------

搜狐笔试

@@@@@@@@@@.同一进程下的线程可以共享以下___ 双选
A. stack
B. data section
C. register set
D. thread ID

我的看法:
A. stack肯定不能共享,否则就乱套了。
B. data section是要共享的,这没问题。
C. register set也不能共享,线程切换时保存和恢复现场寄存器是必须的,我记得保护模式下的TSS就是干这活的。
D. thread ID这玩意一人一个,不共享。

我觉得应该选B,但是题目要求双选,标准答案给的是B和C,寄存器怎么能共享,最起码EIP是没法共享的吧,既然stack不能共享,那ESP肯定也没法共享啊。


@#@############德梅齐里亚克砝码问题:一位商人有一个40磅重的砝码,由于跌落在地而碎成4块,称得每块碎片的重量都是整磅数,而且可以用这4块来称出从1到40磅之间的任意整数磅的重物,请问这4块碎片分别为多重?

我首先给出问题的答案,可能聪明的人看到答案的形式就能猜到其中的规律:1,1*2+1=3,(1+3)*2+1=9,(1+3+9)*2+1=27.
总重是121磅时,第五个砝码是(1+3+9+27)*2+1=81;

 -----------------------------

有道笔试

1、 char p[]={'a','b','c','d','e',''};
 cout<<sizeof(p)<<endl; 6
 char q[]="abcde";
 cout<<sizeof(q)<<endl; 6
char p[]={'a','b','c','d','e'};
 cout<<sizeof(p)<<endl; 5

2、哪个是稳定排序

 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法

4、还有一个计算递归复杂度的
t(n)=n^2+t(n/2)+t(n/3);用递归树来算还是挺方便的,结果是O(n^2)
3、给出中序遍历abcde。问可能的后序遍历

4、用一堆11g和7g的砝码。至少能量出最小值为多少的物品;1g


5、extern int a;
cout<<a;对吗?我觉得只是声明,怎么知道是多少呢
int *p=561;只能赋予0吧。试试了不行,只能传地址

6进程间通讯方式、
8、一道概率题
7、ping命令是哪个协议
使用的是ICMP协议,是“Internet Control Message Protocol”(Internet控制消息协议)的缩写,是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息,本来记得是这个,哎看别人的改错了


7、找出给定数字n1,n2之间的所有素数,两个素数差值为2,返回较小的素数,还要设计一个BigInteger类型的数字。

8、给一个单词ones,如何找出它的变换式如nose,设计数据结构和查询算法

至少这次写出了一些代码
比前几次强多了


 

现在把这些数字放到题目中来。长度短于10的,前面全都加上0补够10位数字。比如1101就变成了0000001101。不过它只有1+4+8=13那么大,远远没有1000大呢!哪个数字对应十进制里面的1000呢?应该是1111111111(1023)-10000(16)-100(4)-10(2)-1(1)=1111101000(1000),这个就是十进制里面的1000。
让瓶子和小白鼠都排成一列,站好了不准动,对瓶子从1到1000编号,然后把号码转化成10位长的二进制串,刚好和10只小白鼠一位对一位。
---------------------
一个瓶子里的二进制编号有哪几位是1,就让那些小白鼠喝下去其中的一点儿东西好了。将来那些喝了的小白鼠刚好都死了而没喝它的一只都没有死,我们就指定它有毒好啦!

3、如果需要对磁盘上的1000W条记录构建索引,你认为下面哪种数据结构来存储索引最合适?()
A、Hash Table                      B、AVL-Tree                      C、B-Tree                 D、List
答:C
2、若某链表最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用()存储方式最节省时间?
A、单链表                   B、带头结点的非循环双链表                       C、带头节点的双循环链表                D、循环链表
为啥???

可用来检测一个web服务器是否正常工作的命令是()
A、ping                      B、tracert                          C、telnet                           D、ftp
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。 
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径。 
telnet命令可以帮助你从这台路由器远程登陆到远端开启了telnet服务的设备,包括路由器、交换机、linux服务器等。并且配置当前路由器的telnet服务。假设该服务器的网页服务器使用的是默认端口,则可以使用命令telnet hostname 80 来测试其是否工作。 
Ftp命令的功能是在本地机和远程机之间传送文件 

、数据库里建索引常用的数据结构是(c)
A、链表                         B、队列                       C、树                             D、哈希表

8、在公司局域网上ping www.taobao.com没有涉及到的网络协议是()
A、ARP                          B、DNS                               C、TCP                         D、ICMP
ping是个icmp协议
DNS是将域名www.taobao.com映射成主机的IP地址,ARP是将IP地址映射成物理地址,ICMP是报文控制协议,由路由器发送给执行ping命令的主机,而一个ping命令并不会建立一条TCP连接,故没有涉及TCP协议。

原文地址:https://www.cnblogs.com/fickleness/p/3159165.html