百度面试题的java实现

简介:
   有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

java实现代码

public   class  test_ant
{
    
private   int [] ants  =   new   int [ 5 ];
    
//  1:左 2:右
     private   int  enumDirection[][]  =   new   int [ 32 ][ 5 ];
    
private   void  initDirection()
    {
        
for  ( int  i  =   16 , column  =   0 ; i  >   0 ; i  =  i  /   2 , column ++ )
        {
            
int  n  =   1 ;
            
for  ( int  j  =   0 ; j  <   32 ; j ++ )
            {
                
if ((j  /  i)  %   2   ==   0 )
                    enumDirection[j][column] 
=   1 ;
                
else
                    enumDirection[j][column] 
=   2 ;
            }
        }
    }
    
private   boolean  checkAnts()
    {
        
for  ( int  i  =   0 ; i  <   5 ; i ++ )
        {
            
if  (ants[i]  >   0   &&  ants[i]  <   28 )
                
return   true ;
        }
        
return   false ;
    }
    
private   void  changeDirection( int  row,  int  col)
    {
        
if  (enumDirection[row][col]  ==   1 )
            enumDirection[row][col] 
=   2 ;
        
else
            enumDirection[row][col] 
=   1 ;
    }
    
public   void  antClimb()
    {
        initDirection();
        
for  ( int  n  =   0 ; n  <   32 ; n ++ )
        {
            
int  seconds  =   0 ;
            ants[
0 =   3 ;
            ants[
1 =   7 ;
            ants[
2 =   11 ;
            ants[
3 =   17 ;
            ants[
4 =   23 ;
            
while  (checkAnts())
            {
                seconds
++ ;
                
for  ( int  i  =   0 ; i  <  ants.length; i ++ )
                {
                    
if  (i  <  ants.length  -   1 )
                    {
                        
//  蚂蚁相遇
                         if  ((ants[i]  ==  ants[i  +   1 ])
                                        
&&  ((enumDirection[n][i]  +  enumDirection[n][i  +   1 ])  ==   3 ))
                        {
                            changeDirection(n, i);
                            changeDirection(n, i 
+   1 );
                        }
                    }
                    
if  (enumDirection[n][i]  ==   1 )
                        ants[i]
-- ;
                    
else
                        ants[i]
++ ;
                }
            }
            
for  ( int  j  =   0 ; j  <   5 ; j ++ )
                System.out.print(enumDirection[n][j]);
            System.out.println(
"" );
            System.out.println(seconds);
        }
    }
    
public   static   void  main(String[] args)
    {
        
new  test_ant().antClimb();
    }
}


其中ants数组保存了5只蚂蚁当前在竿上的位置
enumDirection枚举了所有的32种初始化方向,1代表向左,2代表向右

最短11秒, 最大25秒

运行结果

11111
23
11112
17
11112
23
11122
11
11112
23
11122
17
11122
23
11222
17
11112
23
11122
21
11122
23
11222
21
11122
23
11222
21
11222
23
12222
21
11112
25
11122
25
11122
25
11222
25
11122
25
11222
25
11222
25
12222
25
11122
25
11222
25
11222
25
12222
25
11222
25
12222
25
12222
25
22222

25





 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215573,如需转载请自行联系原作者


相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
84 14
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
37 6
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
78 4
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
138 4
|
3月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
133 1
Java面试题之Java集合面试题 50道(带答案)
|
3月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
79 5