1. 程式人生 > >今日頭條2017內推

今日頭條2017內推

1. 座標系找點

描述:
P為二維座標系中整數點集。定義P中某點x,如果x滿足P中的任一點都不在x的右上方,稱為“最大點”。找到所有的最大點。

輸入:
5
1 2
5 3
4 6
7 5
9 0

輸出:(按x從小到大)
4 6
7 5
9 0

解法一:遍歷每個點,若符合則取出。

import java.util.ArrayList;
import java.util.Scanner;

public class Main1
{
    public static void main(String[] args) { 
        Scanner scanner=new
Scanner(System.in); int n=scanner.nextInt(); int[] xs=new int[n]; int[] ys=new int[n]; for(int i=0;i<n;i++){ xs[i]=scanner.nextInt(); ys[i]=scanner.nextInt(); } for(int i=1;i<xs.length;i++){ for(int j=0;j<xs.length-i;j++){ if
(xs[j+1]<xs[j]){ int xt=xs[j]; int yt=ys[j]; xs[j]=xs[j+1]; xs[j+1]=xt; ys[j]=ys[j+1]; ys[j+1]=yt; } } } maxPoint(xs, ys); } public
static void maxPoint(int[] xs,int[] ys){ ArrayList<Integer> listX=new ArrayList<Integer>(); ArrayList<Integer> listY=new ArrayList<Integer>(); for(int i=0;i<xs.length;i++){ int x=xs[i]; int y=ys[i];//第i個點的座標 for(int j=0;j<xs.length ;j++){ //去掉第i個點 if(xs[j]>x && ys[j]>y){ break; } if(j==xs.length-1){ listX.add(x); listY.add(y); } } } for (int i = 0; i < listX.size(); i++) { System.out.println(listX.get(i)+" "+listY.get(i)); } } }

解法二:解法一中判斷條件的改寫。

public static void maxPoint(int[] xs,int[] ys){

        ArrayList<Integer> listX=new ArrayList<Integer>();
        ArrayList<Integer> listY=new ArrayList<Integer>();

        for(int i=0;i<xs.length;i++){
            int x=xs[i];
            int y=ys[i];//第i個點的座標

            boolean flag=true;//設標識,為true的時候才要這個點

            for(int j=0;j<xs.length ;j++){ //去掉第i個點
                if(xs[j]>x && ys[j]>y){
                    flag=false;
                    break;
                }   

            }
            if(flag){ //注意:這個flag的在第一層for裡,第二層for外
                listX.add(x);
                listY.add(y);
            }

        }
        for (int i = 0; i < listX.size(); i++) {
            System.out.println(listX.get(i)+" "+listY.get(i));
        }           
    }       

2.區間乘積最大值

這裡寫圖片描述
這裡寫圖片描述

解法:如果固定區間滑動,不好找到和前次的關係。固定一個點,區間增長,可用到前次的值。

import java.util.*;

public class Main1 {
    public static void main(String [] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        String [] nums_str = sc.nextLine().split(" ");
        int nums [] = new int[n];
        for(int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(nums_str[i]);
        }


    }
    public static int areaMax(int[] nums){
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int sum=0;
        for(int start = 0; start < n; start++) { //1.表示起始位置         
            //外迴圈每次初始化,不記錄以前的值。
            min = nums[start]; 
            sum=0;          
            for(int end = start; end < n; end++) {//2.end表示結束位置             
                min = Math.min(nums[end],min);    // 找到最小值
                sum+=nums[end];                   //獲得區間和               
                max=Math.max(max,min *sum);       //獲得乘積最小值
            }
        }
        return max;
    }
}