第一题:约瑟夫环变种,K个人,每次淘汰从d开始d =(1,2,3,4,5...k)。想了下最优解无果,直接一把梭哈,下面是代码
package qushi; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class p1 { public static int findIndex(List<Integer> result,int v){ int index = 0; for(Integer tmp : result){ if(tmp == v){ return index; }else{ index++; } } return -1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int k = in.nextInt(); int start = 0; int dk = 1; int len = k; List<Integer> list = new LinkedList<>(); for(int i = 1 ;i <= k; i++){ list.add(i); } for(int i = 1 ;i <= k-1 ;i++){ int dz = (start+dk)%len; // System.out.println("dz为"+dz); // System.out.println("删除元素为"+list.get(dz)); // findIndex(list,list.get(dz+1)); int value = list.get((dz+1)%len); list.remove(dz); dk++; len--; start = findIndex(list,value); } // System.out.println("list长度"+list.size()); System.out.println(list.get(0)); } }
package qushi; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class p2 { static List<String> result = new LinkedList<>(); public static void solu(int index, int right,char res []){ int i = index-1; int j = right+1; String s = ""; if(right == index){ s+=res[index]; }else{ if(res[index] == res[right]){ s+=res[index]; s+=res[index]; } } while ( i >= 0 && j < res.length&&res[i] == res[j] ){ s = res[i]+s; s = s +res[j]; i--; j++; } if(s.length() > 1)result.add(s); } public static void Solutionh(char res []){ for(int i = 0;i < res.length-1; i++){ solu(i,i,res); solu(i,i+1,res); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); String h = in.nextLine(); Solutionh(h.toCharArray()); int maxlen = -1; if(result.isEmpty()){ System.out.println("null"); return; } for(String tmp : result){ if(tmp.length() > maxlen){ maxlen = tmp.length(); } } for(String tmp:result){ if(tmp.length() == maxlen){ System.out.println(tmp); } } } }
求大佬们的更优解。
全部评论
(14) 回帖