第一题:学生站队AC 100%
15分钟AC
public class Solution{ public static int[] DistanceToHigher (int[] height) { if(height == null) return null; int len = height.length; int []dp = new int [len]; dp[0] = 0; for (int i = 1; i < len; i++) { int j = i-1; while(j >= 0 && height[j] <= height[i]){ j--; } if(j < 0) dp[i] = 0; else dp[i] = i-j; } return dp; } }
第二题:从A[0]...A[i-1]中找出有且只有一个元素大于A[i]的情况 AC 100%
import java.util.ArrayList; import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] s = sc.nextLine().split(" "); int N = s.length; int [] A = new int [N]; for (int i = 0; i < N; i++) { A[i] = Integer.parseInt(s[i]); } if(N <= 1){ System.out.println("-1"); return ; }else if(N == 2){ if(A[0] > A[1]){ System.out.println("1"); return ; }else{ System.out.println("-1"); return ; } }else{ //N>=3 boolean flag = false; ArrayList<Integer>list = new ArrayList<Integer>(); if(A[0] > A[1]){ int t = 1; list.add(t); flag = true; } int max = A[0] > A[1] ? 0 : 1; //最大的 int maxx = A[0] < A[1] ? 0 : 1; //次大的 for (int i = 2; i < N; i++) { if(A[max] != A[maxx] && A[i] >= A[maxx] && A[i] < A[max]){ list.add(i); flag = true; } if(A[i] > A[max]){ int tmp = max; max = i; maxx = tmp; }else if(A[i] > A[maxx]){ maxx = i; } } if(!flag){ System.out.println("-1"); } for (int i = 0; i < list.size(); i++) { if(i!=list.size()-1){ System.out.print(list.get(i)+" "); }else{ System.out.print(list.get(i)); } } return ; } } }
第三题:手机靓号 AC 81.82%
动态规划O(N)找出顺子的位数或豹子的位数
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] phone = sc.nextLine().split(","); if(phone.length == 0) System.out.println("null"); ArrayList<String>list = new ArrayList<>(); for (int i = 0; i < phone.length; i++) { String tmp = phone[i].substring(3); if(isShun(tmp) > 0 || isBao(tmp) > 0){ list.add(phone[i]); } } if (list.size() == 0){ System.out.println("null"); }else{ Collections.sort(list,new Comparator<String>() { @Override public int compare(String o1, String o2) { int[] shunOrBao1 = isShunOrBao(o1.substring(3)); int[] shunOrBao2 = isShunOrBao(o2.substring(3)); if(shunOrBao1[1] > shunOrBao2[1]){ return -1; }else if (shunOrBao1[1] < shunOrBao2[1]){ return 1; }else{ if(shunOrBao1[0] == 1){ return 1; }else if(shunOrBao2[0] == 1){ return -1; }else{ return 0; } } } }); for (int i = 0; i < list.size(); i++) { if(i!=list.size()-1){ System.out.print(list.get(i)+","); }else{ System.out.print(list.get(i)); } } } } public static int[] isShunOrBao(String str){ int [] result = new int [2]; int shun = isShun(str); int bao = isBao(str); if(shun == 0){ result[0] = 1; //表示豹子 result[1] = bao; }else if(bao == 0){ result[0] = 0; //表示顺子 result[1] = shun; }else{ if(bao >= shun){ result[0] = 1; result[1] = bao; }else { result[0] = 0; result[1] = shun; } } return result; } public static int isShun(String str){ int shun = 0; //顺子的位数 int [] dp = new int [str.length()]; dp[0] = 1; for (int i = 1; i < str.length(); i++) { if(str.charAt(i) == str.charAt(i-1)){ dp[i] = dp[i-1] + 1; }else{ dp[i] = 1; } } for (int i = 0; i < dp.length; i++) { if(dp[i] >= 3 && shun < dp[i]){ shun = dp[i]; } } return shun; } public static int isBao(String str){ int bao = 0; //豹子的位数 int [] dp = new int[str.length()]; dp[0] = 1; for (int i = 1; i < str.length(); i++) { if(str.charAt(i) == (str.charAt(i-1) + 1)){ dp[i] = dp[i-1] + 1; }else{ dp[i] = 1; } } for (int i = 0; i < dp.length; i++) { if(dp[i] >= 3 && bao < dp[i]){ bao = dp[i]; } } return bao; } }
第四题: AC 0%
继续努力,加油!!!