手撕代码(01)2020NETEASE 模拟
总结【2019.08.05】:
问题1中因为超过80k的部分指针指向错误,导致没有通过所有的用例
问题2中以ABCD结尾的没有做出判断,导致没有通过所有用例
问题3中大致思路没有问题,但是由于上面两个问题检测错误的耗时,导致时间不够【总共给150分钟】
写编程题太慢,每次都还要自己造轮子这个太慢了
改进:
自己写题目的太慢了,这个是当前的现状,最近一定要好好练习。
多练习一些套路,并且准备一些自己做编程题目的模板【自己提前把汽车框架先组装一个半成品】,下次再写编程题时,直接使用这个半成品模板,节省时间。
Answer1
输入样例1:
5
5000
15000
50000
8025
10001
输出样例1:
0
790
9090
93
290
1 package com.cnblogs.mufasa.research2020; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.util.Scanner; 7 8 class Tax{ //检查出错误所在地 9 private static final int[] taxIndex={3000,9000,13000,10000,20000,25000};//6个缴税分界点 10 private static final double[] taxRate={0.03,0.1,0.2,0.25,0.3,0.35,0.45};//7个税率分界点 11 private Scanner sc=new Scanner(System.in); 12 private BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 13 14 public Tax() throws IOException { 15 // int num=sc.nextInt(); 16 int num=Integer.valueOf(br.readLine()); 17 int[] inData=new int[num]; 18 for(int i=0;i<num;i++){//①数据输入 19 // inData[i]=Integer.valueOf(sc.next()); 20 inData[i]=Integer.valueOf(br.readLine()); 21 } 22 23 for(int i=0;i<num;i++){//②数据输出 24 System.out.println(DataDeal(inData[i])); 25 } 26 } 27 28 /** 29 * 单个个人所得税计算 30 * @param income 个人收入 31 * @return taxCash四舍五入整数结果 32 */ 33 private long DataDeal(int income){ 34 double taxCash=0; 35 if(income<=5000){//无需缴税 36 return 0; 37 }else {//需要缴税 38 income=income-5000; 39 for(int i=0;i<taxIndex.length;i++){ 40 if(income/taxIndex[i]>0){//可以进一步计算税费 41 taxCash+=taxIndex[i]*taxRate[i]; 42 income=income-taxIndex[i]; 43 }else {//没有超出80k的缴税单元 44 taxCash+=1.0*income*taxRate[i]; 45 income=0; 46 break; 47 } 48 } 49 if(income>0){//超过80k的部分 50 System.out.println(income); 51 taxCash+=income*taxRate[taxRate.length-1];//todo 错误定位!!!已改正 52 } 53 } 54 return Math.round(taxCash); 55 } 56 } 57 58 59 public class Answer1 { 60 public static void main(String[] args) throws IOException { 61 new Tax(); 62 } 63 } 64 /* 65 1 66 1000000 67 68 48290 69 70 5 71 5000 72 15000 73 50000 74 8025 75 10001 76 77 0 78 790 79 9090 80 93 81 290 82 83 5 84 0 85 1000000 86 5000 87 88 1 89 85000 90 20840 91 92 1 93 60000 94 12090 95 */
Answer2
1 package com.cnblogs.mufasa.research2020; 2 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 6 class StringDone{ 7 private Scanner sc=new Scanner(System.in); 8 public StringDone(){ 9 int T=sc.nextInt(); 10 String[] inData=new String[T]; 11 12 for (int i=0;i<T;i++){//数据输入 13 inData[i]=sc.next(); 14 } 15 16 for (int i=0;i<T;i++){//数据输出 17 System.out.println(DataDeal(inData[i])); 18 } 19 } 20 21 /** 22 * 23 * @param str 24 * @return 25 */ 26 private String DataDeal(String str){ 27 if(str.length()<4){ 28 return str; 29 } 30 31 String strOut=""; 32 ArrayList<Integer> strLine=new ArrayList<>(); 33 int charIndex; 34 int num=0; 35 char end; 36 char[] strArray=str.toCharArray(); 37 38 for(int i=0;i<strArray.length;i++){ 39 if(i==0){//第一次迭代 40 num=1; 41 strLine.add(Integer.valueOf(strArray[i])); 42 strOut+=strArray[i]; 43 44 }else {//后续迭代 45 charIndex=Integer.valueOf(strArray[i]); 46 if(charIndex==strLine.get(strLine.size()-1)+1){//递增字符 47 strLine.add(charIndex); 48 num+=1; 49 strOut+=strArray[i]; 50 if(i==strArray.length-1 && num>=4){//已经到尾部&有4个以上递增字符 51 end=strArray[i];//当前字符 52 strOut=strOut.substring(0,strOut.length()-num+1); 53 strOut=strOut+"-"+end; 54 } 55 }else {//非递增字符 56 if(num>=4){//符合要求处理,不符合要求直接无视 57 end=strArray[i-1];//前一个数据 58 strOut=strOut.substring(0,strOut.length()-num+1); 59 strOut=strOut+"-"+end+strArray[i]; 60 }else { 61 strOut+=strArray[i]; 62 } 63 strLine.clear();//清楚数据 64 strLine.add(charIndex); 65 num=1; 66 } 67 } 68 } 69 return strOut; 70 } 71 } 72 73 public class Answer2 { 74 public static void main(String[] args) { 75 new StringDone(); 76 } 77 } 78 /* 79 1 80 ZABCDEFGXAS 81 82 ZA-GXAS 83 84 输入样例1: 85 3 86 DCBA 87 ZABCDEFGX 88 XYZABCDMMMGHIJKLRST 89 90 输出样例1: 91 DCBA 92 ZA-GX 93 XYZA-DMMMG-LRST 94 95 */
Answer3
输入样例:
3
5 2 113221101000101
13 7 1016
4 12 2222248A
输出样例:
837
13
682
1 package com.cnblogs.mufasa.research2020; 2 3 import java.io.IOException; 4 import java.util.Scanner; 5 6 class NumberLine<T extends Comparable<T>> { 7 private Scanner sc=new Scanner(System.in);//输入更加方便 8 9 public NumberLine(){ 10 int T=sc.nextInt(); 11 int[][] xy=new int[T][2]; 12 String[] strInput=new String[T]; 13 14 for(int i=0;i<T;i++){//数据输入 15 xy[i][0]=sc.nextInt(); 16 xy[i][1]=sc.nextInt(); 17 strInput[i]=sc.next();//自动去除空格 18 } 19 20 for(int i=0;i<T;i++){//数据输出 21 // System.out.println(i+":"+xy[i][0]+" :"+ xy[i][1]); 22 // System.out.println(strInput[i]); 23 System.out.println(DataDeal(xy[i][0],xy[i][1],strInput[i])); 24 } 25 } 26 27 //数据处理 28 private String DataDeal(int x,int y,String str){ 29 String num=""; 30 String str1,str2; 31 boolean flag=(x<y);//从大的位置开始进行 32 int start=0; 33 for(int i=0;i<str.length();i++){//这里的判断后为后续减少很大的计算量 34 if(flag){//x最小 35 if(charToInt(str.charAt(i))>=x){ 36 start=str.length()-i; 37 break; 38 } 39 }else {//y最小 40 if(charToInt(str.charAt(str.length()-i-1))>=y){ 41 start=str.length()-i; 42 break; 43 } 44 } 45 } 46 // System.out.println("start:"+start); 47 48 for(int i=start;i<str.length();i++){ 49 if(flag) { 50 str1 = str.substring(0, str.length() -i); 51 str2 = str.substring(str.length() -i); 52 }else { 53 str1 = str.substring(0, i); 54 str2 = str.substring(i); 55 } 56 num=numToHex(x,str1); 57 // System.out.println("str1="+str1+",str2="+str2); 58 // System.out.println("num1="+num+",num2="+numToHex(y,str2)); 59 if(num.equals(numToHex(y,str2))){ 60 return num; 61 } 62 } 63 return num; 64 } 65 66 //X进制转10进制 【正确】 67 public static String numToHex(int x,String str){ 68 String hexStr=""; 69 long hex=0;//十进制数据 70 char[] strArray=reverse(str).toCharArray(); 71 for(int i=0;i<strArray.length;i++){ 72 hex+=charToInt(strArray[i])*Math.pow(x,i); 73 } 74 return hex+""; 75 } 76 77 //10进制转x进制 【正确】 78 public static String HexToNum(int x,String str){ 79 String numStr=""; 80 int hex=Integer.valueOf(str);//十进制数据 81 int shang; 82 int yu; 83 while (hex>=0){ 84 shang=hex/x; 85 yu=hex%x; 86 numStr+=intToChar(yu);//todo 需要注意数据转换 87 if(shang==0){ 88 break; 89 }else { 90 hex=shang; 91 } 92 } 93 return reverse(numStr); 94 } 95 96 // 字符串反转【正确】 97 public static String reverse(String str) { 98 return new StringBuilder(str).reverse().toString(); 99 } 100 101 //字符转int数据【正确】 102 public static int charToInt(char sin){ 103 int num=Integer.valueOf(sin); 104 if(num>=65){ 105 num-=55; 106 }else if(num<=57){ 107 num-=48; 108 } 109 return num; 110 } 111 112 //int转字符【正确】 113 public static char intToChar(int num){ 114 if(num<=9){ 115 return (char)(num+48); 116 }else { 117 return (char)(num+55); 118 } 119 } 120 } 121 122 public class Answer3 { 123 public static void main(String[] args){ 124 new NumberLine(); 125 // System.out.println(NumberLine.reverse("123456")); 126 // System.out.println(NumberLine.numToHex(8,"12")); 127 // System.out.println(NumberLine.intToChar(9)); 128 // System.out.println(NumberLine.intToChar(0)); 129 // System.out.println(NumberLine.HexToNum(16,"31")); 130 131 } 132 } 133 /* 134 4 135 5 2 113221101000101 136 13 7 1016 137 4 12 2222248A 138 12 4 48A22222 139 140 837 141 13 142 682 143 682 144 */
探究未知是最大乐趣