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

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),大家有其他办法,自己说哈!
...全文
2290 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)
内容概要:本文围绕基于一致性分布式控制的多领航无人机编队跟随控制与轨迹跟踪问题展开研究,通过Matlab代码复现IEEE二区文献中的先进算法,系统阐述了多智能体系统中一致性控制策略的理论基础与实现方法。研究重点在于设计分布式控制律,使得多个领航无人机能够协同引导跟随者形成稳定编队,并精确跟踪预设轨迹,尤其在复杂动态环境下展现出良好的协同性能与系统鲁棒性。内容涵盖系统建模、控制算法设计、仿真验证全过程,并提供了完整的Matlab代码与运行说明,便于读者复现、测试及进一步拓展研究。; 适合人群:具备控制理论基础知识和Matlab编程能力,从事无人机协同控制、多智能体系统、分布式控制及相关领域的研究生、科研人员与工程技术人员。; 使用场景及目标:① 深入理解多无人机编队中基于一致性的分布式控制原理与实现机制;② 掌握轨迹跟踪与编队保持中的协同控制技术;③ 利用所提供的Matlab代码进行算法复现、性能分析与二次开发,服务于学术论文撰写、科研项目验证或工程仿真应用。; 阅读建议:建议结合现代控制理论与多智能体系统相关知识,按照文档结构循序渐进学习,重点关注控制算法设计与代码实现的对应关系,动手运行并调试程序,尝试调整通信拓扑、控制参数等变量以观察系统响应变化,从而深化对分布式协同控制机制的理解与实践能力。
内容概要:本文围绕构网型逆变器的小信号建模问题,提出并实现了一种基于状态空间表示与组件连接法的统一建模框架,旨在复现IEEE二区高水平文献成果。该框架系统整合了两级电压源变流器(VSC)的主电路拓扑与分层控制策略,涵盖有功-无功控制动态、电流内环、锁相环(PLL)频率耦合效应及数字控制延时等关键环节,构建了包含正负序阻抗特性的精细化小信号模型。研究结合扫频仿真与序阻抗提取方法,验证模型准确性,并基于Nyquist与Bode图开展频域稳定性分析,揭示弱电网条件下系统失稳的内在机理,形成从建模、仿真、辨识到稳定性评估的完整技术链条,为新型电力系统稳定性研究提供可复现、可扩展的技术范式。; 适合人群:具备电力系统、电力电子或自动控制领域基础知识的研究生、科研人员及从事新能源并网技术开发的工程师;尤其适合致力于小信号稳定性分析、逆变器建模与仿真验证的技术人员。; 使用场景及目标:① 掌握构网型逆变器统一小信号建模的核心方法,深入理解状态空间与组件连接法在复杂电力电子系统建模中的应用;② 学习如何通过Matlab/Simulink实现阻抗建模与扫频辨识,掌握PLL频率耦合对系统稳定性的影响机制;③ 复现高水平期刊研究成果,提升科研仿真能力与工程建模水平,支撑论文写作与工程验证。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,重点关注状态空间矩阵构建、序阻抗推导与扫频仿真设置等关键步骤,同时对照理论分析与仿真结果,深入理解建模假设与工程实际之间的映射关系,以实现从理论到实践的贯通。
内容概要:本文围绕基于混沌系统与DNA编码的彩色图像加密解密方案展开研究,提出了一种融合混沌序列全局置乱与DNA编码多层扩散的复合加密算法。通过构建完整的加密流程,实现对彩色图像RGB三通道的多层级加密处理,有效打破像素间的空间与灰度相关性,将密钥空间提升至10^127量级,显著增强了抗穷举攻击能力。研究重点开展了抗噪声与抗裁剪性能的系统性分析,验证了算法在高斯噪声、椒盐噪声干扰及不同面积、位置裁剪攻击下的鲁棒性,结果表明解密图像在局部数据缺失情况下仍能保持主体结构清晰与核心信息可用,具备优良的容错性和实用性。此外,研究还探讨了算法在密钥敏感性、像素置乱效果等方面的基础安全特性,形成了较为完整的安全性评估体系。; 适合人群:具备一定图像处理与密码学基础知识的研究生或科研人员,以及从事信息安全、多媒体通信领域的技术人员。; 使用场景及目标:①应用于医疗影像、军事通信、数字版权保护等对安全性要求较高的图像安全传输领域;②为目标用户提供一种高安全性、强鲁棒性的图像加密解决方案,以抵御常见噪声干扰与数据截断攻击;③为后续研究提供可扩展的加密框架基础,推动复合型图像加密技术的发展。; 阅读建议:建议读者结合文中所述的混沌系统参数设置与DNA编码规则进行仿真实验,重点关注密钥敏感性测试与不同强度干扰下的解密效果对比,深入理解算法的置乱扩散机制与鲁棒性成因。

703

社区成员

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

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