31 条回复
前端第一道(最长非公共字符串):
package shunfeng920; import java.util.Scanner; /** * Created by JackHui on 2017/9/20. */ public class no2 { public static void main(String[] args) { Scanner sc = new Scanner( System.in ); String str1=sc.nextLine(); String str2=sc.nextLine(); if(str2.contains( str1 )||str1.contains( str2 )) { System.out.println("0"); } else if(str1.length()>str2.length()) { System.out.println(str1.length()); } else if(str2.length()>str1.length()) { System.out.println(str2.length()); } else if(str1!=str2) { System.out.println(str2.length()); } else { for(int i=0;i<str1.length();i++) { if(str2.indexOf( str1.charAt( i ) )<0) { System.out.println(str1.length()); break; } } } } }
第二道(密码):
package shunfeng920; import java.util.Scanner; /** * Created by JackHui on 2017/9/20. */ public class no1 { public static void main(String[] args) { Scanner sc=new Scanner( System.in ); int x=sc.nextInt(); int[] num=new int[x]; for(int i=0;i<x;i++) { num[i]=sc.nextInt(); } int[] num2=new int[x]; for(int j=0;j<x-1;j++) { num2[j]=num[j]+num[j+1]; System.out.println(num2[j]); } num2[x-1]=num[x-1]; System.out.println(num2[x-1]); } }
题目一:最长非公共子串
function solve(s1, s2) { var len1 = s1.length; var len2 = s2.length; var max = (len1>=len2)?s1:s2; var min = (len1>=len2)?s2:s1; if(max.indexOf(min)===-1){return min.length;} else if(max.indexOf(min)!==-1){ var index = max.indexOf(min); var pre = max.substring(0,index).length; var next = max.substring(index+min.length,max.length).length; return pre>next?pre:next; } }
题目二:木木的密码
function solve(a) { var arr = new Array(a.length); for(var i =0;i<a.length;i++){ arr[i] = a[i] + (a[i+1] || 0); } return arr; }
第二题幸运数字问题 没ac 只有30%
package shunfeng; import java.util.Scanner; /** * Created by Administrator on 2017/9/20 0020. */ public class T2 { static String IntToStr(int n){ StringBuilder stringBuilder=new StringBuilder(); if(n==0)return "0"; while(n>0){ stringBuilder.insert(0,n%2); n=n/2; } return stringBuilder.toString(); } public static void main(String[] args) { Scanner in=new Scanner(System.in); while(in.hasNext()){ //求4和7组成的数字;小于N Long n=in.nextLong(); // System.out.println(n); long x=0; int count=-1; // 4 看成 0 7看成1即可 boolean flag=false; int count1=-1; while(x<=n){ count++; count1++; String s=IntToStr(count); StringBuilder tem=new StringBuilder(); for (int i = 0; i <s.length() ; i++) { if(s.charAt(i)=='0')tem.append(4); else tem.append(7); } x=Long.parseLong(tem.toString()); System.out.println(x); long z=0; while(z<=n) { s="0"+s; tem=new StringBuilder(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '0') tem.append(4); else tem.append(7); } z=Long.parseLong(tem.toString()); if ( z<= n) { count1++; System.out.println("-----" + Integer.parseInt(tem.toString())); } } } System.out.println(count1); } } }
幸运数
public static void main(String args[]){ Scanner reader = new Scanner(System.in); int sum = 0; int num = reader.nextInt(); for(int i = 0; i <= num; i ++){ int b = (i+"").length(); int a = 0; char[] ch = (i+"").toCharArray(); for(int j = 0; j < ch.length; j++){ if((ch[j]+"").matches("[47]")){ a++; } } if(a==b){ sum++; } } System.out.println(sum); }
第二题幸运数问题
import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Main { /******************************开始写代码******************************/ static void solve(long num) { long index = 0; long n = 10; long len = num/10; long count[] = new long[(int) (len+1)]; while(num/n>0){ index++; n = n*10; } long total = 1; /***************************/ for(int i = 0;i<index;i++){ total = total *2; count[i] = total; } // total = 0; for(int i = 0;i<index;i++){ total = total+count[i]; } // if(num<4){ System.out.println(0); return; } if(num<7){ System.out.println(1); return; } if(num<44){ System.out.println(2); return; } while(index>=0){ n = n/10; if(num/n<4){ System.out.println(total); return; }else if(num/n==4){ index--; }else if(num/n<7){ System.out.println(total+count[(int) index-1]); return; }else if(num/n ==7){ total =total+count[(int)index-1]; index--; }else if(num/n>7){ System.out.println(total+count[(int) index-1]*2); return; } num = num-(num/n)*n; if(num<10){ if(num<4){ System.out.println(total); return; } if(num<7){ System.out.println(total+1); return; } System.out.println(total+2); return; } } } /******************************结束写代码******************************/ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); long num = scanner.nextLong(); scanner.close(); solve(num); } }
public class Main { static int find2(String a, int index, int length) { // 444->1 447->2 474->3 477->4 744->5 747->6 774->7 777->8 // 规律是末位的4贡献1,7贡献2,非末位的4无贡献,7贡献2^n,n为7后面的位数 char c = a.charAt(index); if (index == length-1) { if (c == '4') return 1; else return 2; } if (c == '4') return find2(a, index+1, length); else return (int)Math.pow(2, length-index-1) + find2(a, index+1, length); } static int find(String a) { // 找到小于该整数的最大数,且该最大数只由4和7组成 if (a.charAt(0) < '4') return 0; StringBuffer b = new StringBuffer(a.length()); char c; boolean overflow = false; for (int i = 0; i < a.length(); i++) { if (overflow) { b.append("7"); continue; } c = a.charAt(i); if (c < '4') { while (i > 0 && b.charAt(--i) != '7') { b.deleteCharAt(i); } if (b.length() == 0) return 0; b.setCharAt(i, '4'); overflow = true; } else if (c == '4') b.append("4"); else if (c < '7') { b.append("4"); overflow = true; } else if (c == '7') b.append("7"); else { b.append("7"); overflow = true; } } return find2(b.toString(), 0, b.length()); } static int solve(String a) { int ret = 0; int size = a.length(); int MOD = 1000000007; int up = find(a); // 长度与a相同的幸运数 // 长度比a小的幸运数 for (int i = 1; i < size; i++) { ret += Math.pow(2, size-i); ret %= MOD; } return (ret + up) % MOD; } public static void main(String[] args) { Scanner in = new Scanner(System.in); while (true) { String bigNum = in.nextLine(); int ret = solve(bigNum); System.out.println(ret); } } }
抛砖引玉一下,答完了才写出来的,也不知道对不对
package myPackage; //顺丰科技测试题 public class Main { public static void main(String[] args) { for(int i = 0; i < 100; i++){ int limit = (int) (Math.random() * 2100000000); //21亿 System.out.println("数的上界: " + limit); String numStr = String.valueOf(limit); char[] numArray = numStr.toCharArray(); long start = System.currentTimeMillis(); int c1 = firstNum(numArray); long end = System.currentTimeMillis(); long t1 = (end - start) > 0 ? (end - start) : 1; System.out.println("算法的结果:" + c1 + ", " + "用时" + t1 + "ms"); start = System.currentTimeMillis(); int c2 = countLuckyNum(limit); end = System.currentTimeMillis(); long t2 = (end - start) > 0 ? (end - start) : 1; System.out.println("蛮力检验的结果:" + c2 + ", " + "用时" + t2 + "ms, 比算法慢了" + String.format("%.2f", (1 - 1.0 / t2 / (1.0 / t1)) * 100) + "%" ); if(c1 != c2){ System.out.println("出现错误!!!!!!!!!!!!!!!!!!!!!!!!"); break; } System.out.println(); } System.out.println("算法正确"); } //处理第一个数字的取值(因为如果第一个数字可取0,并且会导致紧跟着的后面的数字可取0, 所以要区分对待第一个数字和其他数字) static int firstNum(char[] arr){ int n = whichNum(arr[0]); int len = arr.length; if(len == 1){ if(n > 7 || n == 7) return 2; else if((n > 4 || n == 4) && n < 7) return 1; else return 0; } if(n > 7) return (int) (Math.pow(2, len + 1) - 2); else if(n == 7){ int testValue = nextNum(arr, 1); int certainValue = (int) (3 * Math.pow(2, len - 1) - 2); if(testValue == -1) return certainValue; else return testValue + certainValue; } else if(n > 4 && n < 7){ return (int) (3 * Math.pow(2, len - 1) - 2); } else if(n == 4){ int testValue = nextNum(arr, 1); int certainValue = (int) (Math.pow(2, len) - 2); if(testValue == -1) return certainValue; else return testValue + certainValue; } else return (int) (Math.pow(2, len) - 2); } //处理第一个数字后面的数字 static int nextNum(char[] arr, int p){ if(p == arr.length) return 1; else{ int r = arr.length - p; int n = whichNum(arr[p]); if(n > 7) return (int) Math.pow(2, r); else if(n == 7){ int testValue = nextNum(arr, p + 1); int certainValue = (int) (Math.pow(2, r - 1)); if(testValue == -1) return certainValue; else return testValue + certainValue; } else if(4 < n && n < 7){ return (int) Math.pow(2, r - 1); } else if(n == 4){ return nextNum(arr, p + 1); } else return -1; } } //数字字符转为数字 static int whichNum(char c){ switch(c){ case '1' : return 1; case '2' : return 2; case '3' : return 3; case '4' : return 4; case '5' : return 5; case '6' : return 6; case '7' : return 7; case '8' : return 8; case '9' : return 9; default : return 0; } } //下面用蛮力法验证算法的正确性 static int countLuckyNum(int limit){ int count = 0; for(int i = limit; i > 3; i--){ if(isLuckyNum(i)){ count++; } } return count; } static boolean isLuckyNum(int num){ int value; while(num > 0){ value = num % 10; if(value != 4 && value != 7) return false; num /= 10; } return true; } }
static int topDigit(char[] arr){ //讨论最高位的值n int n = arr[0] - '0'; int r = arr.length; //此处不用专门讨论数字只有一位的情况, 因为也符合规律 int result = (int) (Math.pow(2, r) - 2); //countLessDigit if(n > 7) result += (int) (Math.pow(2, r)); else if(n == 7) result += nextDigit(arr, 1) + (int)Math.pow(2, r - 1); else if(n > 4) result += (int)Math.pow(2, r - 1); else if(n == 4) result += nextDigit(arr, 1); return result; } static int nextDigit(char[] arr, int pos){ //讨论最高位后面的较低位的值n if(pos == arr.length) return 1; int r = arr.length - pos; int n = arr[pos] - '0'; if(n > 7) return (int) Math.pow(2, r); else if (n == 7) return (int)Math.pow(2, r - 1) + nextDigit(arr, pos + 1); else if (n > 4) return (int) Math.pow(2, r - 1); else if(n == 4) return nextDigit(arr, pos + 1); else return 0; }
添加回复