banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

常见的软件公司变态的面试编程题目的解决办法

今天上博客园转转,看到一篇介绍常见的软件公司变态的面试编程题目的日志遂决定提前解决调,早有准备,要是诸位网友曾经经历这些问题的话,欢迎留言感激!

1.任意给定一个整数 n,请写出一个算法计算 1-2+3-4+5-6+7……n 的结果

错答:这么答的话,多一个 FOR 循环,效率可是极低的,O (n),软件公司肯定不要你了。

int n = this.TextBox1.Text.ToString();
// 原文错误,C# 语言,改为 int n=Int.Prase (this.TextBox1.Text.ToString ());
int Sum = 0 ;
for (int i = 0 ; i < n + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i;
}
else
{
Sum = Sum - i;
}
}

正解:分析下算式的结构 可知道(1-2)=(3-4)=……=(2n-1)-(2n)= -1
那么用回溯法就可以推导 结果是 n/2 个 - 1 加上个 n 咯,再判断 N 的符号就可以
知道结果了本算法开销只有 O(1)

int n = input();
int result=(-1) * (n/2) + (n)*(n%2 ? -1:1);
printf("%d",result);

2.任意给定一个整数 n,显示 n 的 2008 次方的末四位。

错答:一个数的 2008 方结果不溢出才怪,软件公司肯定要考虑是否要你了

void main()
{
int Y,P;
Y=n^2008;
cout<<"n 的 2008 次方是:"<

正解:总结分析分析一般 1~5 的 2008 次方结果一样的,5^2008 一般不会
溢出吧,要是再精简,可以换成 n^1004*n^1004,或者 502*502*
502*502 的形式,结果是一样的

long n=input();
long result=((n%6)^2008)%1000;// 可以换 1004*1004
cout<

3.A、B 两个整数,请写出一个算法不借助其他变量将两个数值对换。

正解:两个数交换比借用第三变量,单片开发中肯定会用到的,时间换空间
华为考过 N 次

void main()
{
cout<<"转换前 A="<

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。