按层打印二叉树(中序和前序)
https://exercise.acmcoder.com/online/online_judge_ques?ques_id=4172&konwledgeId=169
package other;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Main4 {public static void main(String[] args) {//452 3 1后序 425 1 3中序// 1 245 3 前序 425 1 3 i-inlScanner input = new Scanner(System.in);int num = input.nextInt();int[] pre = new int[num];int[] in = new int[num];for (int i = 0; i < num; i++) {pre[i] = input.nextInt();}for (int i = 0; i < num; i++) {in[i] = input.nextInt();}Node head = createTree(pre,0,pre.length-1,in,0,in.length-1);printTree(head,num);}public static int findRoot(int root,int[] in,int il,int ir){for (int i = il; i <= ir; i++) {if(root == in[i]){return i;}}return -1;}public static void printTree(Node head,int num){Queue<Node> q = new LinkedList<>();q.add(head);int i = 0;while(!q.isEmpty()){Node n = q.poll();i++;System.out.print(n.val);if(i<num){System.out.print(" ");}if(n.left!=null){q.add(n.left);}if(n.right!=null){q.add(n.right);}}}public static Node createTree(int[] pre,int pl,int pr,int[] in,int il,int ir){if(pl>pr||il>ir){return null;}Node node = new Node();node.val = pre[pl];int i = findRoot(pre[pl],in,il,ir);node.left = createTree(pre,pl+1,pl+i-il,in,il,i-1);node.right = createTree(pre,pl+i-il+1,pr,in,i+1,ir);return node;}private static class Node{public int val;public Node left;public Node right;}}
utf8编码器 业务题

package other;import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main3 {public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNext()){String str = in.nextLine();String[] arr = str.split("\\s+");int len = arr.length;int[] nums = new int[len];for(int i = 0; i < len; ++i){nums[i] = Integer.parseInt(arr[i]);}int i = 0;List<Integer> ans = new ArrayList<>();boolean isOk = true;while(i<len && isOk){int temp = 0;if(nums[i]<128){//0xxxxxxxans.add(nums[i++]);}else if(nums[i]<224){//110xxxxx 10xxxxxxfor (int j = 0; j < 2; j++) {if(j==0){nums[i]-=192;}else if(i<len && nums[i]>=128&&nums[i]<192){nums[i]-=128;}else{isOk =false;}if(isOk){temp += nums[i++]*Math.pow(2,(1-j)*6);}}ans.add(temp);}else if(nums[i]<240){//1110for (int j = 0; j < 3; j++) {if(j==0){nums[i]-=224;}else if(i<len && nums[i]>=128&&nums[i]<192){nums[i]-=128;}else{isOk =false;}if(isOk){temp += nums[i++]*Math.pow(2,(2-j)*6);}}ans.add(temp);}else if(nums[i]<248){//11110for (int j = 0; j < 4; j++) {if(j==0){nums[i]-=240;}else if(i<len && nums[i]>=128&&nums[i]<192){nums[i]-=128;}else{isOk =false;}if(isOk){temp += nums[i++]*Math.pow(2,(3-j)*6);}}ans.add(temp);}else if(nums[i]<252){//111110for (int j = 0; j < 5; j++) {if(j==0){nums[i]-=248;}else if(i<len && nums[i]>=128&&nums[i]<192){nums[i]-=128;}else{isOk =false;}if(isOk){temp += nums[i++]*Math.pow(2,(4-j)*6);}}ans.add(temp);}else if(nums[i]<254){//1111110for (int j = 0; j < 6; j++) {if(j==0){nums[i]-=252;}else if(i<len && nums[i]>=128&&nums[i]<192){nums[i]-=128;}else{isOk =false;}if(isOk){temp += nums[i++]*Math.pow(2,(5-j)*6);}}ans.add(temp);}else{isOk=false;break;}}if(isOk){for (int j = 0; j < ans.size() ; j++) {System.out.print(ans.get(j)+" ");}}else{System.out.print("no");}System.out.println();}}}
IP过滤器 前缀树
https://www.nowcoder.com/questionTerminal/8389e1ccd47d40ba859c2497a428d0ca
自己做的前缀树法
package mypractice;import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class Main2 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int N = in.nextInt();int M = in.nextInt();in.nextLine();Node head = new Node(new HashMap<String,Node>());for (int i = 0; i < N; i++) {String s = in.nextLine();String[] rule = s.split("\\.");Node cur = head;for (int j = 0; j < rule.length ; j++) {if(!cur.children.containsKey(rule[j])){cur.children.put(rule[j],new Node(new HashMap<>()));}cur = cur.children.get(rule[j]);}cur.isEnd=true;}for(int i=0;i<M;i++){String s = in.nextLine();String[] ip = s.split("\\.");boolean res = search(head,ip);System.out.print((res ? 1 : 0)+" ");}}private static boolean search(Node head,String[] ip){Node cur = head;if(cur.children.containsKey(ip[0])){cur = cur.children.get(ip[0]);for (int i = 1; i < ip.length ; i++) {if(cur.children.containsKey(ip[i])){cur = cur.children.get(ip[i]);}else if(cur.children.containsKey("*")){return true;}else{break;}}if(cur.isEnd)return true;}cur = head;if(cur.children.containsKey("*")){cur = cur.children.get("*");// ip地址的第一个 第二个 第三个都可以用*去匹配for (int i = 3; i >= 1 ; i--) {boolean res = help(i,ip,cur);if(res)return true;}}return false;}private static boolean help(int i,String[] ip,Node cur){for (; i <ip.length ; i++) {if(cur.children.containsKey(ip[i])){cur = cur.children.get(ip[i]);}}return cur.isEnd;}private static class Node{public boolean isEnd;public Map<String,Node> children;public Node(Map<String, Node> children) {isEnd = false;this.children = children;}}}
暴力法
/**
* 前缀 后缀 的匹配问题 easy
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
sc.nextLine();
//读取规则
String[] patterns = new String[N];
for(int i =0 ;i < N;i++){
patterns[i] = sc.nextLine();
}
//读取IP
String[] IPs = new String[M];
for(int i = 0;i < M; i++){
IPs[i] = sc.nextLine();
}
//暴力匹配
for(int i = 0; i < IPs.length;i++){
boolean lock = false;
for(int j = 0; j < patterns.length;j++){
String t = "";
if(patterns[j].charAt(0) == '*'){
t = patterns[j].replace("*","");
if(IPs[i].endsWith(t)){
System.out.print(1 + " ");
lock = true;
break;
}
}else if(patterns[j].charAt(patterns[j].length()-1) == '*'){
t = patterns[j].replace("*","");
if(IPs[i].startsWith(t)){
System.out.print(1 + " ");
lock = true;
break;
}
}else{
if(patterns[j].equals(IPs[i])){
System.out.print(1 + " ");
lock = true;
break;
}
}
}
if(lock == false){
System.out.print(0 + " ");
}
}
}
}
排队问题 动态规划

https://www.nowcoder.com/questionTerminal/5b36556ae602486f96be163c1ee21f1f
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] score = new int[n];
for (int i = 0; i < score.length; i++) {
score[i] = in.nextInt();
}
int k = in.nextInt();
int d = in.nextInt();
int[][] maxdp = new int[k][n];
int[][] mindp = new int[k][n];
//j位置结束 选取i+1个人能力最大值 i:0~k-1
for (int i = 0; i < n; i++) {
maxdp[0][i] = score[i];
mindp[0][i] = score[i];
}
int max = Integer.MIN_VALUE;
for (int i = 1; i < k; i++) {
for (int j = 0; j < n; j++) {
for (int p = j-1; p >=Math.max(0,j-d) ; p--) {
maxdp[i][j] = Math.max(maxdp[i][j],maxdp[i-1][p]*score[j]);
maxdp[i][j] = Math.max(maxdp[i][j],mindp[i-1][p]*score[j]);
mindp[i][j] = Math.min(mindp[i][j],mindp[i-1][p]*score[j]);
mindp[i][j] = Math.min(mindp[i][j],maxdp[i-1][p]*score[j]);
}
}
}
for (int i = 0; i < n; i++) {
max = Math.max(maxdp[k-1][i],max);
}
System.out.println(max);
}
}
