程序员面试题100题(一)(转)

题目选自以下博客网址:
http://zhedahht.blog.163.com/#。

第26题:
题目:输入一个正数n,输出所有和为n连续正数序列。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。

分析:这是网易的一道
面试题

我自己的思路:
首先想到的是等差数列的求和,即(m1+(m1+k-1))*k=n*2,  其中起始数字start=m1,结束数字end=m1+k-1;
因此这道题目的解和n*2的因子有关,解的集合在2n的在 [2,sqrt(2n)] 区间的几个因子相关。每个因子可能对应一个解,但是也可能这个因子没有解。

int
 imax
=
(
int
)Math.Sqrt(n
*
2
)
+
1
;

for
(
int
 i
=
2
; i
<
imax;i
++
)
{
    
if
((n
*
2
)
%
i
==
0
)
    {
        
//
我们找到了i是2n的一个因子

temp
=
n
*
2
 
-
 i
*

+
 i;
        
if
( temp
%
(i
*
2
)
==
0
)
        {
            
//
我们发现这个因子确实是一个解

start
=
temp
/
(i
*
2
);
            end
=
start
+
 i 
-
1
;
            Console.WriteLine(
"
{0}-{1}
"
, start,end);
        }
    }
}

当n=30000时,输出结果如下:

9999-10001
5998-6002
1993-2007
1188-1212
922-953
363-437
265-360
178-302
108-267

我觉得它的好处是代码量较少,清晰易读。

————————————————————————————————————————
第23题:跳台阶问题
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。

分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者
笔试题

首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。

现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。

我们把上面的分析用一个公式总结如下:

/  1                          n=1
f(n)=      2                          n=2
        \  f(n-1)+(f-2)               n>2

分析到这里,相信很多人都能看出这就是我们熟悉的Fibonacci序列。

问题的解,是一个树形结构,我引入了TreeView中的节点TreeNode来成生这个树,它是一个典型递归:

//
组装一个根节点成为一颗树

static
 
void
 AddNode(System.Windows.Forms.TreeNode root,
int
 n)
    {
        
if
(n
>
2
)
        {
            root.Nodes.Add(
"
1
"
);
            root.Nodes.Add(
"
2
"
);
            AddNode(root.Nodes[
0
],n
-
1
);
            AddNode(root.Nodes[
1
],n
-
2
);
            
        }
        
else
 
if
(n
==
1
)
        {
            root.Nodes.Add(
"
1
"
);
        }
        
else
 
if
(n
==
2
)
        {
            root.Nodes.Add(
"
1
"
);
            root.Nodes[
0
].Nodes.Add(
"
1
"
);
            
            root.Nodes.Add(
"
2
"
);
        }
    }

树组装好以后,每一个叶子节点的全路径就是一个解,因此将叶子节点的FullPath(路径)打印出来即为一个解,这里为了找到叶子节点,也是使用递归:

//
打印出所有叶子节点的全路径

static
 
void
 PrintNode(TreeNode node)
{
    
//
属于叶子节点!!!!则打印这个路径

if
(node.Nodes.Count
==
0
)
        Console.WriteLine(node.FullPath);
    
else

{
        
foreach
(TreeNode child 
in
 node.Nodes)
        {
            PrintNode(child);
        }
    }
}

当输入n=5时,打印出所有叶子节点的FullPath如下:

root\1\1\1\1\1
root\1\1\1\2
root\1\1\2\1
root\1\2\1\1
root\1\2\2
root\2\1\1\1
root\2\1\2
root\2\2\1

我们可以把一个解在一个TreeView里面完整显示出来:

递归算法有一个很受限制的地方,它占用栈空间以深度的级数速度增长,如果深度太大,会迅速达到空间上限。因此只适合较浅深度求解。

原文地址:https://www.cnblogs.com/xyy2019/p/11806919.html

时间: 2024-10-25 04:43:50

程序员面试题100题(一)(转)的相关文章

Java程序员面试题集(1-50)

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

Java程序员面试题集(71-85)

Java程序员面试题集(71-85) 摘要:这一部分主要包括了UML(统一建模语言).面向对象的设计原则(六原则一法则).GoF设计模式.企业级设计模式.JDBC(Java数据库连接).XML(可扩展标记语言)等知识. 71.UML是什么?UML中有哪些图? 答:UML是统一建模语言(Unified Modeling Language)的缩写,它发表于1997年,综合了当时已经存在的面向对象的建模语言.方法和过程,是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化

java程序员面试题day01

Java程序员面试题day01 1.jdk和jre有什么区别?各自有什么作用? jdk是java开发的工具包,主要包含各种的类库和工具如javac/javaw/java,也包括了另外的一个jre,提供了两个不同的虚拟机,jdk的bin目录下有client和server两个文件下的jvm.dll文件:jre作为运行环境,仅仅有一个client下的jvm.dll文件. 1.如何利用jdk 编译和运行应用程序? javahome如何配置? 进入到java文件的目录下 编译语句:javac HelloW

中软国际Java程序员笔试题

1.谈谈final, finally, finalize的区别. final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载. finally:在异常处理时提供 finally 块来执行任何

《PHP程序员面试笔试真题解析》——新书上线

你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚踏入PHP职场,你值得拥有这本书来自学一番,再去尝试找PHP相关的工作,对你帮助绝对不是一般的大!! PS:宝典和真题解析其实是一套的~ 以下简单的对我的新书做个介绍~ 前言 本书的适用群体:刚接触PHP,自学一段时间PHP后打算去找PHP相关的PHP面试工作的群体.这部分群体可以尝试着去练习这部分企业中经常

Java面试学问多,看看高级程序员面试题是什么样的

Java 面试跟着时刻的改动而改动.在以前的日子里,当你知道 String 和 StringBuilder 的差异就能让你直接进入第二轮面试,可是如今疑问变得越来越高档,面试官问的疑问也更深入. 在以前初入职场的时分,类似于 Vector 与 Array 的差异.HashMap 与 Hashtable 的差异是最盛行的疑问,只需求记住它们,就能在面试中取得更好的时机,但这种景象已经不复存在.如今,你将会被问到许多 Java 程序员都没有看过的范畴,如 NIO,规划形式,老练的单元测验,或许那些很

java程序员面试题大全含答案(2018--2019)

java程序员面试题大全含答案(2018--2019) 1.10道经典java面试题_实习生必问! 2.15个Java线程并发面试题和答案 3.15个高级Java多线程面试题及回答 4.2018年java分布式相关最新面试题 5.2018最新java技术面试题与答案 6.4个Spring常见面试题及答案解析 7.css面试题及答案 8.HR常问面试题总结(上) 9.HR常问面试题总结(下) 10.html面试题及答案 11.java中String类的面试题大全含答案 12.java二叉树算法面试

Java程序员面试题集(51-70)

摘要:这一部分主要讲解了异常.多线程.容器和I/O的相关面试题.首先,异常机制提供了一种在不打乱原有业务逻辑的前提下,把程序在运行时可能出现的状况处理掉的优雅的解决方案,同时也是面向对象的解决方案.而Java的线程模型是建立在共享的.默认的可见的可变状态以及抢占式线程调度两个概念之上的.Java内置了对多线程编程的支持在20世纪90年代可以说是一个巨大的进步,但是最初的设计在当下看来已经给程序带来很多困扰了.感谢Doug Lea在Java 5中提供了他里程碑式的杰作java.util.concu

Java程序员面试题集(86-115)

摘 要:下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏洞后已经显得江河日下,而Spring MVC的异军突起更加加速了Struts 2的陨落,但面试中仍然有可能被问及和此框架相关的内容,毕竟Struts 2曾经被阿里巴巴.京东以及政府企业门户网站广泛采用.另一方面,Hibernate目前仍然是ORM框架中的中坚力量,MyBatis在此领域也有不容 忽视的一席之地,因此了解这两个ORM框架对Java程序员是很有必要的.第一期发布的Ja