马上掘金

186 阅读2分钟

当青训营遇上码上掘金,一篇文章给三个青豆,青豆可以用来换礼物,但是需要写满500个字,其中代码占比不能超过百分之三十。虽然不知道代码好像不算进字符中,但当你使用了代码块之后确实有一定的增加。

第一题是两个小孩想要相遇,就算一个起点,一个终点。 从起点出发可以向前一步或者向后一步,或者坐公交车坐标乘2,但是公交车不能往后开。

因此这道题可以简单使用广度优先搜索。

广度优先搜索模板非常的常见。应该算得上必须是牢记于心的模板。 需要记住几点的有创建一个队列, 初始化元素,起点。 while判断队列非空, 每次出队一个元素, 将这个元素拓展放在队列后。

这里是带轮次的广度优先搜索,因此需要再考虑到一轮for循环,其中for的次数是当时队列大小。需要特别取出来,否则使用q.size()因为队列大小变化出错。

另外一种写法是将index压入队列中,组成一个int[],我认为稍微有一些麻烦,但是在处理某些问题时,比如两个坐标x,y这个时候再加一个又显得方便了。

还有最后一点,获得了正确答案之后直接返回,以获取第一个获取的最优解,如果要获取最后一个就需要加一个全局变量了,不断迭代替换。总体框架不变。

/**
* 支持 import Java 标准库 (JDK 1.8
*/
import java.util.*;

/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
   public static void main(String []args) {
      Scanner s = new Scanner(System.in);
      int n = 2;
      int k = 3;
      Queue<Integer> q = new LinkedList<>();
      q.offer(n);
      int t = 0;
      while(!q.isEmpty()){
        int size = q.size();
        for(int i=0;i<size;i++){
          int tmp = q.poll();
          if(tmp==k){
            System.out.println(t);
            return;
          }
          q.offer(tmp-1);
          q.offer(tmp+1);
          q.offer(tmp*2);
        }
        t++;
      }
   }
}