企鹅的几道笔试题,大家乐一乐哈

qq55000055 2013-12-06 04:22:28
第一道
int main()
{
if(______________)
{
printf("Hello");
}
else
{
printf("World");
}

return 0;
}

要求输出结果是“HelloWorld",问if后面空白填什么

比较扯淡的解法 填 0 == printf("Hello") 这个输出答案正确,但是扯淡了哈!

要么 vfork(),不懂自己查。 想用setjmp和longjmp,但是只准填横线那部分,LZ没尝试出来,大牛请尝试。


第二题 不用库函数 while for 实现strlen。

解法 递归。。

int mystrlen(char* p)
{
return *(p++) ? mystrlen(p)+1 : 0;
}

不明就里的童鞋多看看哈。 想到了goto,没实现(谭老师说了少用的)


第三题

单链表逆转程序
struct Node
{
struct Node* next;
}


给出了头指针Node* pHeadNode。


这个不难,自己找哈。



第四题

一个有序数组a={1,3,6,.....,89,...,90318..}和一个数X,从数组中找出两个数,使得两个数的和等于X,要使时间复杂度尽量的低。

LZ的思路

第一个想法 二分查找,开始自己以为大概是O(NlogN),但是面试官说是O(N²),这个肯定不对;

第二个想法 用bitset,数组有的位置为1,然后循环从第一个数用X减,减出来的值如果置为了1则,则输出,不行下一个。这个是O(N)+O(N) 事件复杂度是O(N),大家有其他办法,自己说哈!
...全文
2171 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xy369503 2014-02-10
  • 打赏
  • 举报
回复
static void Main(string[] args)
        {
            var array = new List<int> { };
            var array2 = new List<int> { };
            int n = 10000, x = 100, position = -1;
            for (int i = 0; i < n; i++)
            {
                array.Add(i);
            }
            for (int i = 0; i < array.Count && array[i] <= x; i++)
            {
                array2.Add(x - array[i]);
                position = i;
            }

            for (int i = 0; i < array2.Count && position >= 0; i++)
            {
                var a = array2[i];
                while (position >= 0)
                {
                    var b = array[position];
                    if (a < b)
                    {
                        position--;
                    }
                    else if (a == b)
                    {
                        if (a != x - a)
                        {
                            Console.WriteLine("{0},{1}", a, x - a);
                        }
                        position--;
                        break;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
brk1985 2014-01-25
  • 打赏
  • 举报
回复
mark下。。。
qq55000055 2013-12-31
  • 打赏
  • 举报
回复
引用 28 楼 xh19910615 的回复:
[quote=引用 27 楼 u012892254 的回复:] 引用 9 楼 u012892254 的回复: 楼主现在在企鹅没? 没在,工作还没离职,不准备去企鹅,准备去当甲方。钱多事少能骂人。 IT行业甲方是指哪些?银行?保险?还是移动联通等运营商?楼主指点
同求 一直没搞清楚[/quote] 比如说xxx设计院 XXX银行软件开发中心 XXX石油信息技术有限公司 运营商 这些都是 但是不建议去运营商,虽然可以骂人,但是活也不少。 而且上述也要分部门,面试的时候一定要问清楚干什么的。
大奶兔白糖 2013-12-31
  • 打赏
  • 举报
回复
引用 26 楼 Vegertar 的回复:
第一题,要说扯淡的解法,弄成注入就可以了,又没说不让回车,反正语法也允许多行。

int main()
{
    if (1)
#define else if (1)
    {
                      printf("Hello");
    }
    else
    {
                      printf("World");
    }
    
    return 0;
}

哥们儿很猛。。
爱吃冰红茶 2013-12-30
  • 打赏
  • 举报
回复
引用 27 楼 u012892254 的回复:
引用 9 楼 u012892254 的回复: 楼主现在在企鹅没? 没在,工作还没离职,不准备去企鹅,准备去当甲方。钱多事少能骂人。 IT行业甲方是指哪些?银行?保险?还是移动联通等运营商?楼主指点
同求 一直没搞清楚
skss 2013-12-21
  • 打赏
  • 举报
回复
引用 9 楼 u012892254 的回复: 楼主现在在企鹅没? 没在,工作还没离职,不准备去企鹅,准备去当甲方。钱多事少能骂人。 IT行业甲方是指哪些?银行?保险?还是移动联通等运营商?楼主指点
qq55000055 2013-12-20
  • 打赏
  • 举报
回复
引用 9 楼 u012892254 的回复:
楼主现在在企鹅没?
没在,工作还没离职,不准备去企鹅,准备去当甲方。钱多事少能骂人。
破碎的泡泡 2013-12-20
  • 打赏
  • 举报
回复
引用 12 楼 truelance 的回复:
第1题貌似扯淡方法才是正确的. vfork()不能保证两个分支的执行顺序.
vfork函数创建的子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改都为父进程所见。这与fork是完全不同的,fork进程是独立的空间。另外一点不同的是vfork创建的子进程后,父进程会被阻塞,直到子进程执行exec()和exit()
qq55000055 2013-12-20
  • 打赏
  • 举报
回复
引用 11 楼 lyjgames 的回复:
校招吗?题目这么简单
社招的题目。
qq55000055 2013-12-20
  • 打赏
  • 举报
回复
引用 14 楼 sj178220709 的回复:
[quote=引用 13 楼 sj178220709 的回复:] 为什么大家都是两边向中间逼近呢? 用中间往两边发散的方式,效率会高一些吧.
好吧 ,突然发现我2了. 两次linq的遍历 就是不小的消耗了. 哎,应用系统写多了,对什么空间复杂度,时间复杂度没感觉了啊. [/quote] 额,这这这。。没办法安慰你了
破碎的泡泡 2013-12-20
  • 打赏
  • 举报
回复
引用 5 楼 qq55000055 的回复:
[quote=引用 2 楼 trustin 的回复:] 不知这样行不行

        //0(N)
        private string find(int[] array, int X)
        {
            int i = 0;
            int n = array.Length;
            while (i < n - 1)
            {
                if (array[i] + array[n] < X)
                {
                    i++;
                }
                if (array[i] + array[n] > X)
                {
                    n--;
                }
                else
                {
                    return array[i].ToString() + ":" + array[n].ToString();
                }
            }
            return "null";

        }
你这个好像和我说的第一个差不多吧貌似这么写复杂度是O(N),但是那面试官说我不对。。纠结[/quote] 求解为什么不对?我也是这么想的
北漂的小青年 2013-12-20
  • 打赏
  • 举报
回复
第一题,貌似只能是fork子进程了。我估计是if ( 0 == fork() )。父进程的话先打印Hello,子进程的话打印World。至于这个顺序问题,可能需要更深入的人来解决了。 最后一个问题,我觉得是使用hash表了。首先把所有数组元素创建hash表,然后使用X减去数组中任意元素,看看hash表中是否存在。若存在,则就是这个hash值对应元素与减去元素的和。 这样可以查出所有的和为X的组合。时间复杂度O(N).
Vegertar 2013-12-20
  • 打赏
  • 举报
回复
第一题,要说扯淡的解法,弄成注入就可以了,又没说不让回车,反正语法也允许多行。

int main()
{
    if (1)
#define else if (1)
    {
                      printf("Hello");
    }
    else
    {
                      printf("World");
    }
    
    return 0;
}

Vegertar 2013-12-20
  • 打赏
  • 举报
回复
第一题vfork肯定是不行的,相同的地址空间也意味着子进程在return 0后时会关闭父进程的标准输出,父进程的printf肯定出不来,不崩即不错了。 最后一题O(N)没什么好说的,O(N^2)你以为能AC吗?不是你听错了,就是面试官晃点你。
qq55000055 2013-12-20
  • 打赏
  • 举报
回复
引用 23 楼 paopaozai 的回复:
[quote=引用 18 楼 paopaozai 的回复:] [quote=引用 5 楼 qq55000055 的回复:] [quote=引用 2 楼 trustin 的回复:] 不知这样行不行

        //0(N)
        private string find(int[] array, int X)
        {
            int i = 0;
            int n = array.Length;
            while (i < n - 1)
            {
                if (array[i] + array[n] < X)
                {
                    i++;
                }
                if (array[i] + array[n] > X)
                {
                    n--;
                }
                else
                {
                    return array[i].ToString() + ":" + array[n].ToString();
                }
            }
            return "null";

        }
你这个好像和我说的第一个差不多吧貌似这么写复杂度是O(N),但是那面试官说我不对。。纠结[/quote] 求解为什么不对?我也是这么想的[/quote] 没人回答一下吗?[/quote] 难道是我发错地方了吗?求第一题最后一题 大家认可答案
破碎的泡泡 2013-12-20
  • 打赏
  • 举报
回复
引用 18 楼 paopaozai 的回复:
[quote=引用 5 楼 qq55000055 的回复:] [quote=引用 2 楼 trustin 的回复:] 不知这样行不行

        //0(N)
        private string find(int[] array, int X)
        {
            int i = 0;
            int n = array.Length;
            while (i < n - 1)
            {
                if (array[i] + array[n] < X)
                {
                    i++;
                }
                if (array[i] + array[n] > X)
                {
                    n--;
                }
                else
                {
                    return array[i].ToString() + ":" + array[n].ToString();
                }
            }
            return "null";

        }
你这个好像和我说的第一个差不多吧貌似这么写复杂度是O(N),但是那面试官说我不对。。纠结[/quote] 求解为什么不对?我也是这么想的[/quote] 没人回答一下吗?
hhhhhh90123 2013-12-10
  • 打赏
  • 举报
回复
int main() { if(printf("Hello") && 0) { printf("Hello"); } else { printf("World"); } return 0; }
  • 打赏
  • 举报
回复
引用 13 楼 sj178220709 的回复:
为什么大家都是两边向中间逼近呢? 用中间往两边发散的方式,效率会高一些吧.
好吧 ,突然发现我2了. 两次linq的遍历 就是不小的消耗了. 哎,应用系统写多了,对什么空间复杂度,时间复杂度没感觉了啊.
  • 打赏
  • 举报
回复
为什么大家都是两边向中间逼近呢? 用中间往两边发散的方式,效率会高一些吧.

 public static void Main1()
        {
            IList<int> list = new List<int> {1, 3, 6, 8, 12, 13, 14, 17, 20, 23, 24, 25, 34, 56, 76, 135};
            const int sum = 36;
            int count = list.Count;
            int index1 = list.IndexOf(list.LastOrDefault(a => a < sum / 2));
            int index2 = list.IndexOf(list.FirstOrDefault(a => a > sum / 2));
            if (index2-index1>2)
            {
                //表示中间至少有两个数等于x/2,可以直接输出结果了
                return;
            }
            int tempSum = 0;
            while (!(index1 == -1 || index2 == count || tempSum == sum))
            {
                tempSum = list[index1] + list[index2];
                if (tempSum > sum)
                {
                    index1--;
                    continue;
                }
                if (tempSum < sum)
                {
                    index2++;
                    continue;
                }
            }
            if ((index1 == -1 || index2 == count))
            {
                Console.WriteLine("无解");
            }
            else
            {
                Console.WriteLine("位置{0}的{1}和位置{2}的{3}和为{4}", index1, list[index1], index2, list[index2], sum);
            }
        }
熊熊大叔 2013-12-09
  • 打赏
  • 举报
回复
第1题貌似扯淡方法才是正确的. vfork()不能保证两个分支的执行顺序.
加载更多回复(11)

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧