别人的面试题

1、问题:证明哥德巴赫猜想!即从6到n的任意偶数均能拆成两个素数的和!

问题:证明哥德巴赫猜想!即从6到n的任意偶数均能拆成两个素数的和!若有高效算法请与我联系!

 

今年真是流年不利呀!在华为招聘网上报名的职位搞到传说找人极少的部分IT管理类,信息安全,本想好好燃烧一下,可是人家不给机会真是郁闷!

事情是这样的!

华为IT管理类要求有笔试,写了好几年Java,为了这个考试加班加点看了一遍C。好不容易通过华为笔试,听说面试就是考算法,也没太当回事,

毕竟写了这么多年程序,就是C的语法比较郁闷!大意啦,大意啦!

见到面试官,他给我一道题后就去面试其他同学了,我的题目是:证明哥德巴赫猜想。当时挺紧张,不过感觉答得还成,做完后面试官过来看了看

我的程序说:“思想不好,回去等通知!”当时我的心就凉了,大家都知道华为是当场面试四轮,如果你在第一轮就被宣布“等通知”,那就没戏了。

我问:“我的算法哪里有问题?”面试官很和蔼的高告诉我,这个是保密的。这是我有生以来的第一次面试,本来十分期待进入华为,真的是本身就

很喜欢这个公司,喜欢他狼性的企业文化,可是这一切就这么离我远去!!

我把我写的程序整理了一下,希望大家能帮我提提意见,我的算法究竟差在什么地方呢?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
bool judge(int t)
{
 for(int i=2;i<=sqrt(t);i++)
  if(t % i == 0)
   return false;
 return true;
}
bool find(int array[],int t,int j)
{
 int max = j-1;
 int min = 0;
 while(min <= max)
 {
  if(array[(min+max)/2] == t)
   return true;
  if(array[(min+max)/2] > t)
   max = (min+max)/2-1;
  else
   min = (min+max)/2+1;
 }
 return false;
}
int f(int n)
{
 int j=0;
 int * array ;
 bool flag = false;
 array = (int *)malloc(sizeof(int)*n/2);
 for(int i=3;i<=n-3;i++)
  if(judge(i))
   array[j++]=i;
 for(i=6;i<=n;i=i+2)
 {
  int pos = 0;
  flag = false;
  while(array[pos] <= i/2)
  {
   if(find(array,i-array[pos],j))
   {
    flag = true;
    break;
   }
   pos++;
  }
  if(!flag)
   return 1;
 }
 return 0;
}
int main()
{
 int n;
 scanf("%d",&n);
 cout<<f(n);
 return 0;
}

 

2、

真没想到昨天晚上投的慧通,今天晚上就收到笔试通知。真不愧是华为的合作伙伴,连答题纸都长得一样!有意思的试题如下。

 

1。char *p = "ab";
     printf("%d,%d ",p,p+5);
地址问题,类型为char的地址下移5个为原地址值+5;今天做错了:(

2。int i=10,j=20,k=30;
     k *= i+j;
     printf("%d ",k);

输出为900,考优先级,做对了:)

3。enum string{x1,x2,x3=10,x4,x5};
     int x=x5;
     printf("%d,%d ",x,x1);

输出为12,0,做错了:(

4。int data[1024];

问实际使用的数组范围,应该是0~1023,呜呜,我还以为数组不能太大呢!原来这么大也可以!

5。typedef union data{
        long l;
        double d;
    }Data;
sizeof(data),sizeof(Data)的值都是8,取sizeof(double)的值,而不是sizeof(double)和sizeof(int)的和。

6. void *memcpy(void *destin, void *source, unsigned n); 

n不能超过目标的长度。此函数定义在<string.h>中。

暂时能想起来这么多,今天的大题是:将一个字符串如“abcde”反向输出“edcba”。我的方法是将对称的两个字母换位。

 

 

 

3/

今天群硕笔试,考了好多内容,其中Java占很大部分!

 

本试卷中最有难度的编程题:给定一个数组,这个数组中既有正数又有负数,找出这个数组中的子数组,此子数组的和最大!(思考中,有好办法留言呀!)

最不知道怎么答的题:在TCP/IP中最经常使用的编程方法?

最简单的题:final, finally, finalize的区别(因为经常考)

最容易疏忽的题:main(){C c;}在前面已经定义了C的类,这个地方容易迷糊的就是,没有new,照样执行构造函数,没有free,照样执行析构函数。

最迷糊的题:一个无向图是否能够存到树中?为什么?

最然我感到有差距的题:EJB中一定包括()interface,()interface,()class

 

 

给定一个数组,这个数组中既有正数又有负数,找出这个数组中的子数组,此子数组的和最大!

我是西北大学的,把这到题写了. 测试过.竟请参考!如有疑问可联系本人,qq:121083095

#include<stdio.h>
void main()
{
int a[15]={2,3,-4,5,6,-5,-1,14,9,-10,1,-71,75,4,-9};
int b[15]; //计算和
int num=a[14];
int c[15]; //最大尾数标志数组

int n=14;
int i,j=0;

for(i=14;i>=0;i--) //从后计算和放入b中
{
c[i]=n;b[i]=num;
if(num<0){n=i-1;num=0;}
num=num+a[i-1];
}

printf("/n");
for(i=0;i<15;i++)
printf("%d, ",b[i]);
printf("/n");

//找到最大字符子串
num=b[0];n=c[0];
for(i=0;i<15;i++)
if(b[i]>num){num=b[i];j=i;n=c[i];}
for(i=j;i<=n;i++)
printf("%d, ",a[i]);
printf("sum=%d",num);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值