2018网易实习编程2记录

[问题描述]

1.题目是这样的:假设有n条道路,每条道路上都需要有路灯,路灯只能照亮左右和自己的位置的三块区域,道路上可能还会有一些障碍(每个占一块区域),求给定一段道路求解至少需要多少的路灯!

假设有一条道,路况是这样的(1000XX200XXX300040005000X6000700X80),. 表示需要照明的地方,X表示这块区域是障碍物,不能被照明。针对这样的道路,我们用肉眼就可以看的出需要8盏灯,我用颜色和序号标出。

那么这个要怎么计算,首先我认为要求出像这样连续的照明区域有多少块(也就是连续这的0有多少个,1个也算连续),在上述例子中有5块这样的区域,每一块对4除法运算+1,会得到这样的区域,因为每块区域至少会1个灯泡,所以加1。所以这样运算的结果就是求得每一块区域的路灯数,然后相加就行了。下图为运算结果,代码附上。

上图:图片好像坏了,应该很好理解的,嗯,就这样。得意


                                                                 

package test02;

import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;

public class text03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int load = 0;                                       //总共有load条道路
        int query = 0;                                      //每条路有query个方格
        String post = null;                                 //存储每条路上的路况
        int[] list;                                         //需要的灯泡数目
        Scanner scanner1 = new Scanner(System.in);
        Scanner scanner2 = new Scanner(System.in);
        Scanner scanner3 = new Scanner(System.in);
        load = scanner1.nextInt();                 
        list = new int[load];
        for(int i=0;i<load;i++){
        	   query = scanner2.nextInt();
        	   post = scanner3.nextLine();
               list[i] = text03.Result(query,post);          //将灯泡树返回到数组中
        }
        for(int j = 0;j<load;j++) {
        	System.out.println(list[j]);                     //打印出需要的灯泡数目
        }
        scanner1.close();
        scanner2.close();
        scanner3.close();
            
	}
	public static int Result(int query,String post) {
		int count  = 0;                                     //存储连续照明的方块数目
		int[] point;                                        //下标表示第几处
		int p = 0;                                          //下标的自增
		int sum = 0;                                        //灯泡的个数之和
		post = post+'X';                                    //给每条道路最后加一个限制  使得我们的条件成立
		point = new int[post.length()];                     //初始化数组
		int leng = post.length();                                   
		for(int i=0;i<leng;i++) {                           //遍历整个字符串如果  数数  连着点 有几个  并且记住他们的个数.
			if('X' != post.charAt(i)){
			 count++;                                       //第p处的连续点数的个数           
			 }else {
				 point[p++] = count;                        //存到第p处
				 count = 0;                                 //点数置为0  寻找p+1处的点数
			 }
		}
		for(int y = 0;y<point.length;y++) {                 //能存进point数组  说明至少有一处是.  也就是至少要有一个灯泡  使用point[y]/3+1 求得y处的需要的灯泡数目
			                                                //并且返回sum  存入
                 if(point[y]!=0) {
                	 sum = sum + point[y]/4+1;
                 }
		}
		return sum;
	}

}

猜你喜欢

转载自blog.csdn.net/h2677lucy/article/details/79732780
今日推荐