现在的位置: 首页 > 综合 > 正文

面试逻辑题

2019年04月20日 ⁄ 综合 ⁄ 共 3712字 ⁄ 字号 评论关闭


1.    

一位教授把16张扑克牌放在桌上让学生甲乙记住,,如下:

黑桃: A 7 Q
红心: 3 4 7 9 J Q
梅花: 2 3 5 Q K
方块: A 5
然后教授从中选出一张。把这张牌的数告诉了他的学生“甲”,
把花色告诉了“乙”。然后教授问“甲”说:“你知道是那一张牌吗?”
 

  甲:“我不能确定是那张牌。”
  乙:“我知道你会这样说。”
  甲:“现在我知道了。”
  乙:“现在我也知道了。”
教授高兴的点点头。甲、乙二人都是有很强逻辑推理能力的,并且都说了实话。
根据以上信息,通过你的推理告诉我这张是什么牌?

从第一句话可以排除掉 黑桃J,8,2,7,3 草花K,6因为这种点数只出现一次.
从第二句话可以知道Q所知道的花色中所有的点数都出现过两次或以上才肯定P不知道是哪一张牌.这样我们可以看出只有红桃和方块存在这种现象,所以必然是这两种花色之一.
从第三句话P肯定自己知道是什么牌可以知道这个点数在红桃和方块里肯定是唯一性,所以可以排除红桃和方块A还剩下红桃Q ,4和方块5不能肯定了.但是Q知道花色啊.所以
从第四句话可以肯定就是方块5了,因为是红桃中的其中一个的话,Q是不能判断他知道的.
所以结论就是方块5

2. 
某城市发生了一起汽车撞人逃跑事件
该城市只有两种颜色的车,蓝色15% 绿色85%
事发时有一个人在现场看见了
他指证是蓝车
但是根据专家在现场分析,当时那种条件能看正确的可能性是80%
那么,肇事的车是蓝车的概率到底是多少

解答:
整个城市的车比例为15%蓝,85%绿,这是前提。

那么先不考虑目击者的情况下,肇事车的可能就是15%蓝,85%绿。

现在假设肇事车是蓝色的,那么在那种情况下目击者把肇事车还看成蓝色(也就是认对)的情况是80%;

若果假设肇事车是绿色的,那么在那种情况下目击者把肇事车看成蓝色(也就是认错)的情况是20%。

那么总的看来,不管对错,目击者把肇事车看成蓝色的总概率就是15%*80%+85%*20%=0.29。

而其中肇事车是蓝色目击者也看成蓝色(也就是目击者看对)的概率就是15%*80%=0.12。

也就是说,在目击者看见肇事车是蓝车这个前提下,他看对的概率(亦即肇事车确实是蓝车)就应该是0.12/0.29=12/29。

总共有四种情况:

A、肇事车是绿色的,目击者把绿色的肇事车还看成绿色的;

B、肇事车是绿色的,目击者把绿色的肇事车看错成蓝色的;

C、肇事车是蓝色的,目击者把蓝色的肇事车还看成蓝色的;

D、肇事车是蓝色的,目击者把蓝色的肇事车看错成绿色的。

概率分布情况就是:

PA=85%*80%=0.68;
PB=85%*20%=0.17;
PC=15%*80%=0.12;
PD=15%*20%=0.03。

这四种情况中,只有B、C两种情况下,目击者才会认为自己看到的车才是蓝色的,而其中只有C情况下,肇事车才确定是蓝色的。

所以,在目击者认为自己看到的是蓝色车这个前提下,肇事车确实是蓝色车的概率就是:0.12/(0.12+0.17)=12/29。 完毕。

3.

一个人的夜明珠丢了,于是他开始四处寻找。有一天,他来到了山上,
看到有三个小屋,分别为1号、2号、3号。从这三个小屋里分别走出来一个女子,
1号屋的女子说:“夜明珠不在此屋里。”2号屋的女子说:“夜明珠在1号屋内。”
3号屋的女子说:“夜明珠不在此屋里。”这三个女子,其中只有一个人说了真话,
那么,谁说了真话?夜明珠到底在哪个屋里面?

1号说了真话。
夜明珠在3号屋里。
三种假设:
一、1号说了真话。夜明珠不在1号屋,那就在2、3号屋里。2号说在1号屋里,那就是错的.3号说不在3号屋,那也是错的。
二、2号说了真话。那1号说的就是错的,而3号说的是对的。不符合题目。
三、3号说了真话。那夜明珠就在1、2号屋里。如果本来是在1号屋,那1号说了假话,2号说了真话。不符合题目。如果本来是在2号屋,那1号说了真话,2号说了假话。也不符合题目。
综上所述,1号说了真话。夜明珠在3号屋里。

 

技术题
1.有变量说明int a=3;, 则表达式a<1&&--a>1的运算结果和a的值应该是( B  )
 A. 0和2    B. 0和3    C. 1和2    D. 1和3
&&运算从左边开始,若左为假则结束运算,结果为假,所以不会计算右边的表达式;
同理,可得对“||”的处理一样

2.char a2[]="\thello\0"; strlen(a2)值为6;
strlen只计算字符串中字符个数直到 '\0'

3.对于浮点变量f,能实现对f中的值在小数点后第三位进行四舍五入的表达式有____
A)f=(f*100+0.5)/100.0 B)f=(f*100+0.5)/100 C)f=(int)(f*100+0.5)/100.0 D)f=((int)(f*100+0.5))/100.0

4.void fun(int i)
{
    printf("%d,", i);
    printf("dddd\n");    
}
int main(int argc, char *argv[])
{   
    int i = 5;
    fun(i);
    fun; //这个是对的,猜的原因是把fun当函数指针了
 
    printf("Press enter to continue ...");
    getchar();    
    return 0;
}

4.

 写一个“标准”宏,这个宏返回一个数组最高维的下标(如数组a[2][4][6],执行宏之后结果是2)

#define firstdem(array) sizeof(array)/sizeof(array[0])

#include <stdio.h>

#define firstdem(array) sizeof(array)/sizeof(array[0])

void main()

{

int aa[2][3][4]={1,1,2,2,2,2};

int num;


num=firstdem(aa);

printf("%d\n",num);

}


5. 关于内存的分析

//1
void GetMemory1(char *p)
{
    p = (char *)malloc(100);    
}

void Test1(void)
{
    char *str = NULL;
    GetMemory1(str);
    strcpy(str, "hello");
    printf("%s\n", str);    
}
运行Test1后会出现什么结果?

答:GetMemory1();函数实参与形参之间是值传递,所以在调用GetMemory1函数后str还是为NULL,所以在编译时会抛出段异常错误

//2
char *GetMemory2()
{
    char p[] = "hello world";    
    return p;
}

void Test2()
{
    char *str = NULL;
    
    str = GetMemory2();
    printf("%s\n", str);    
}

运行Test2后会出现什么结果?

答:在GetMemory2函数中的数组p是分配在栈中所以函数结束后会被回收,在函数外面再次访问这段内存,读出的是无法预料的内容
//3
void GetMemory3(char **p, int num)
{
    p = (char *)malloc(num);
}
void Test3(void)
{
    char *str = NULL;    
    GetMemory3(&str, 100);    
    strcpy(str, "hello");    
    printf("%s\n", str);    
}

运行Test3后会出现什么结果?
答:输出hello,但更完美的应该是在malloc申请了内存后要判断是否申请成功,还有要在使用完后释放这段内存哦

//4
void Test4(void)
{
    char *str = (char *)malloc(100);
    strcpy(str, "hello");
    free(str);
    if (str != NULL)
    {
        strcpy(str, "world");
        printf("%s\n", str);           
    }    
}

运行Test4后会出现什么结果?
答:运行出现段异常,因为在free释放了这段内存,所以在程序中不能再使用
应该是在malloc申请了内存后要判断是否申请成功,还有要在使用完后释放这段内存并将str赋值为NULL,避免造成野指针

6. 读下面这段代码:

struct S {

  int i;

  int * p;

};

void main()

{

  S s;

  int * p = &s.i;

  p[0] = 4;

  p[1] = 3;

  s.p = p;

  s.p[1] = 1;

  s.p[0] = 2;

}

问:程序会在哪一行死掉,为什么。

看出来没,p指向结构体的首地址,执行完

  s.p = p;

使s.p也指向结构体首地址,

  s.p[1] = 1;

这句中s.p[1]的赋值实际是给s的成员p赋值为1,既是p指向地址

  s.p[0] = 2;
这句是将p所指向的地址的内容改写为2(即将地址1的内容改为2,想想内存地址1用户可以随便改吗?),所以在这句会出现错误

【上篇】
【下篇】

抱歉!评论已关闭.