安置路灯

122 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

安置路灯

image-20220124223122885.png

思路解读

由数据输入范围为1e6,故可猜测算法可用时间复杂度为O(n) 遇到.的情况才需要照明,当遇到X的时候无需照明,若当前位置为. ,且下一个位置不为.,为X,则必须设置一个路灯,若当前位置为.,且下一个位置也是.,则将路灯设置在下一个位置,而无需管当前位置的下2个位置是X还是.,直接跳过,故有代码。

AC代码

 import java.io.*;
 ​
 public class Main{
     public static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     public static void main(String[] args) throws Exception{
         String s = bf.readLine();
         int n = Integer.parseInt(s);
         s = bf.readLine();
         char [] str = new char[n];
         str = s.toCharArray();
         int ans = 0;
         boolean flag = false;
         for(int i=0;i<n;i++) {
             if(!flag && str[i] == '.' && i + 1 < n && str[i + 1] == '.') {
                 flag = true;
             }else if(!flag && str[i] == '.') {
                 ans ++;
             }else {
                 if(flag && str[i] == '.') {
                     flag = false;
                     ans ++;
                     i++;
                 }
             }
         }
         System.out.println(ans);
     
     }
 }

递归算法

本来打算采用递归算法,但是采用递归算法后,发生栈越界,想想也是,栈不能存那么那么多数

 import java.io.*;
 ​
 public class Main{
     public static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     public static void main(String[] args) throws Exception{
         String s = bf.readLine();
         int n = Integer.parseInt(s);
         s = bf.readLine();
         char [] str = new char[n];
         str = s.toCharArray();
         System.out.println(f(str,0));
     }
     public static int f(char [] s, int x) {
         if(x >= s.length)
             return 0;
         if(s[x] == '.') {
             if(x+1 < s.length && s[x+1] == '.')
                 return 1 + f(s,x+3);
             else 
                 return 1 + f(s,x+2);
         }else {
             return f(s,x+1);
         }
     }
 }

image-20220124225601292.png

所以需要将递归改为递推

递推AC代码(其实和上一个代码是一样的)

 import java.io.*;
 ​
 public class Main{
     public static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     public static void main(String[] args) throws Exception{
             String s =  bf.readLine();
         int n = Integer.parseInt(s);
         s = bf.readLine();
         char [] str = new char[n];
         str = s.toCharArray();
         System.out.println(f(str));
     }
     public static int f(char [] s) {
         int ans = 0;
         int n = s.length;
         int x = 0;
         while(x < n) {
             if(s[x] == '.') {
                 if(x + 1 < n && s[x + 1] == '.') {
                     ans ++;
                     x +=3;
                 }else {
                     ans ++;
                     x +=2;
                 }
             }else {
                 x++;
             }
         }
         return ans;
     }
 }

image-20220124230051667.png