首页 > 试题广场 >

逛街

[编程题]逛街
  • 热度指数:9277 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 

输入描述:
输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
1<=wi<=100000; 


输出描述:
输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。
示例1

输入

6
5 3 8 3 2 5

输出

3 3 5 4 4 4

说明

当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static Stack<Integer> stackLeft = new Stack<>();
    public static Stack<Integer> stackRight = new Stack<>();

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int len = Integer.valueOf(scanner.nextLine());
        String[] strs = scanner.nextLine().split(" ");
        Integer[] ints = strsToInts(strs, len);
        String res = "";
        for (int i = 0; i < len; i++){
            if (i!=len-1){
                res += look(ints, i)+" ";
            }else{
                res += look(ints, i);
            }
        }
        System.out.println(res);
    }

    public static Integer look(Integer[] items, int index){
        stackLeft.clear();
        stackRight.clear();
        for (int offset = 1; index-offset >=0||index+offset < items.length; offset++){
            int left = index-offset;
            int right = index+offset;
            if (left >= 0){
                int leftItem = items[left];
                if (stackLeft.empty()){
                    stackLeft.push(leftItem);
                }else{
                    if (stackLeft.peek()<leftItem){
                        stackLeft.push(leftItem);
                    }
                }

            }
            if (right <= items.length-1){
                int rightItem = items[right];
                if (stackRight.empty()){
                    stackRight.push(rightItem);
                }else{
                    if (stackRight.peek()<rightItem){
                        stackRight.push(rightItem);
                    }
                }

            }

        }
        return stackLeft.size() + stackRight.size() + 1;
    }

    public static Integer[] strsToInts(String[] strs, int len){
        Integer[] ints = new Integer[len];
        for (int i = 0; i < len; i++){
            ints[i] = Integer.valueOf(strs[i]);
        }
        return ints;
    }
    
}
身为一个小菜鸡,我尽力了【自闭】
发表于 2020-09-03 19:33:00 回复(0)
import java.util.Scanner;

public class Tencent2 {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = Integer.valueOf(scan.nextLine());
String s = scan.nextLine();//包含实际数组的字符串
outPut(s);
}
public static void outPut (String s){
String[] str = s.split(" ");
int[] arr = new int[str.length];
//获取数组
for (int i = 0; i < str.length; i++) {
arr[i] = Integer.valueOf(str[i]);
}

if (arr.length==1) {
System.out.println("1");//排除长度为1的数组
}else if (arr.length==2) {
System.out.println("2 2");//排除长度为2的数组
}else {
for (int i = 0; i < arr.length; i++) {//剩余情况仅包含楼栋数>=3
if (i==0) {
System.out.print(getCount(arr,i+1,true)+1+" ");//当处于第一栋楼的时候看到的数量
}else if ( i==arr.length-1) {
System.out.print(getCount(arr,arr.length-i,false)+1);//当处于最后一栋楼看到的数量
}else {
System.out.print(getCount(arr,i+1,true)+getCount(arr,arr.length-i,false)+1+" ");//当处于中间楼看到的数量
}
}
}
}
//获取倒序数组
public static int[] reverse(int[] a) {
int[] b = new int[a.length];
for(int start=0,end=b.length-1;start<=end;start++,end--) {
int temp=a[start];
b[start]=a[end];
b[end]=temp;
}
return b;
}
//获取当前朝向所看到的楼栋数(不包含本身所在楼)
public static int getCount (int[] arrb,int j, boolean a) {
int count = 1;
if (!a) {
arrb = reverse(arrb);
}
int max = arrb[j];
for (int i = j; i < arrb.length; i++) {
if (arrb[i]>max) {
max = arrb[i];
count++;
}
}
return count;
}

}


编辑于 2020-03-15 07:32:11 回复(0)
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
public class Main{
public static void main(String[] args){
List<Integer> ls = new ArrayList<>();//记录输入
Scanner in = new Scanner(System.in);
while(in.hasNextInt()) {
ls.add(in.nextInt());
}
int inputNum=ls.get(0);
int[] inputArr = new int[inputNum];
for(int i=1;i<inputNum+1;i++){
inputArr[i-1]=ls.get(i);
}
int[] outs = new int[inputNum];
Stack<Integer> stack1 = newStack<>();
int deep=0;//记录栈的深度
//向左看
for(int i=0;i<inputNum;i++){
if(stack1.empty()||stack1.peek()>inputArr[i]){
if(!stack1.empty()&&stack1.peek()>inputArr[i]){
outs[i]+=deep;
}
stack1.push(inputArr[i]);
deep++;
}else{
while(!stack1.empty()&&inputArr[i]>=stack1.peek()){
outs[i]+=1;
stack1.pop();
deep--;
}
outs[i]+=deep++;
stack1.push(inputArr[i]);
}
}
//向右看
stack1.clear();
deep=0;
int[] outs2=newint[inputNum];
for(int i=inputNum-1;i>=0;i--){
if(stack1.empty()||stack1.peek()>inputArr[i]){
if(!stack1.empty()&&stack1.peek()>inputArr[i]){
outs2[i]+=deep;
}
stack1.push(inputArr[i]);
deep++;
}else{
while(!stack1.empty()&&inputArr[i]>=stack1.peek()){
outs2[i]+=1;
stack1.pop();
deep--;
}
outs2[i]+=deep++;
stack1.push(inputArr[i]);
}
}
//整理输出
for(int i=0;i<inputNum;i++){
if(i==(inputNum-1)){
System.out.print((outs[i]+outs2[i]+1));
}else{
System.out.print((outs[i]+outs2[i]+1)+" ");
}
}
}
}
编辑于 2020-02-23 22:18:58 回复(0)