1、12306的购票模块的测试用例
3、数组a[i]=f(i),如a[0]=f(0),视为一个函数,找出函数的最大尖峰段,即先上升再下降的最长段落
输入:n:数组的长度
a[i],每个数组的值
输出:数组最长段落的下标值:起始位置 结束位置
package cn.com.jinritoutiao;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FindMaxPeakStage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
System.out.println(findmaxPeakStage(arr));
}
}
/*
* 寻找尖峰段
*/
public static int findPeakStage(int[] arr) {
int end = 0;
int peak = 0;
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
peak = i;
break;
}
}
int j = 0;
for (j = peak; j < arr.length - 1; j++) {
if (arr[j] < arr[j + 1]) {
end = j;
break;
}
}
if(j == arr.length-1){
end = arr.length-1;
}
return end;
}
/*
* 寻找最长的尖峰段
*/
public static String findmaxPeakStage(int[] arr){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int i = 0; i < arr.length;) {
int[] subArray = Arrays.copyOfRange(arr, i, arr.length);
int end = findPeakStage(subArray);
if((double)end/arr.length>1/2.0){
return String.valueOf(i)+" "+String.valueOf(end+i);
}
map.put(i,end+i);
i = end+i;
}
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1,Map.Entry<Integer, Integer> o2){
return (o2.getValue()-o2.getKey())-(o1.getValue()-o1.getKey());
}
});
int start = list.get(0).getKey();
int end = list.get(0).getValue();
return String.valueOf(start)+" "+String.valueOf(end);
}
}
官方答案:
package cn.com.jinritoutiao;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
* 求给定数列 A 中先升后降的最长连续子序列,要求 O(n)。
*简单题。预处理 left[i] 表示以 A[i] 为结尾的连续最长上升序列长度,
*right[i] 表示 A[i] 为起始的连续最长下降序列长度,
*那么答案实际上就是 max{left[i] + right[i] - 1},更新答案时顺便记录最优区间即可。
*唯一的 trick 是 left[i] > 1 和 right[i] > 1 必须同时满足,这一点在题目中已经有说明。
*/
public class FindMaxPeakStage2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int[] left = new int[n];
int[] right = new int[n];
int max = 0;
String str;
for(int i = 1;i<n-1;i++){
for(int j = i;j>0;j--){
if(arr[j-1]<arr[j]){
left[i]++;
}else{
break;
}
}
for(int j = i;j<n;j++){
if(arr[j]>arr[j+1]){
right[i]++;
}else{
break;
}
}
if(left[i]+right[i]-1>max){
max = left[i]+right[i]-1;
str = String.valueOf(left[i]) +" "+String.valueOf(right[i]);
}
}
}
}
}
4、输入:N,M(N个句子构成一个段落,M个句子),N,M均为int
N行句子
M行句子
输出:N行句子中与M行句子最相似的M行
package cn.com.jinritoutiao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n= sc.nextInt();
int m = sc.nextInt();
String str = sc.nextLine();
String[] para = new String[n];
String[] sente =new String[m];
for(int i =0;i<n;i++){
para[i] = sc.nextLine();
}
for(int i =0;i<m;i++){
sente[i] = sc.nextLine();
}
for(int i =0;i<m;i++){
Map<Integer ,String> hash= new HashMap<Integer ,String>();
for(int j = 0;j<n;j++){
hash.put(findAlike(sente[i],para[j] ),para[i]);
}
int[] arr = new int[hash.size()];
int k =0;
for(Integer j:hash.keySet()){
arr[k] = j;
k++;
}
System.out.println(hash.get(max(arr)));
}
}
}
public static int findAlike(String s1,String s2){
String[] arr1 = s1.split(" ");
String[] arr2 = s2.split(" ");
List<String> list1 = new ArrayList<String>();
for(String s:arr1){
list1.add(s);
}
List<String> list2 = new ArrayList<String>();
for(String s:arr1){
list1.add(s2);
}
HashSet<String> hashset1 = new HashSet<String>(list1);
list1.clear();
list1.addAll(hashset1);
int count = 0;
for(int i=0;i<list1.size();i++){
if(list2.contains(list1.get(i))){
count++;
}
}
return count;
}
public static int max(int[] arr){
for(int i = 0;i<arr.length-1 ;i++){
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] = temp;
}
}
return arr[arr.length-1];
}
}