顺丰科技有做笔试的么
发布于 2017-09-20 16:03 4331 次浏览 0 赞 来自 试题交流  

做的视觉题,全是机器学习的被虐死了

31 条回复

做完了 = =

前端的  编程题全AC

2017-09-20 16:23
2
coder_PG6ZS5GJ 回复 青玉

恭喜你,算法岗没有编程,都是理论

2017-09-20 16:25
青玉 回复 coder_PG6ZS5GJ

也不用恭喜.。。。我估计做前端的编程题都ac了。毕竟真的简单。

2017-09-20 16:26
coder_N6BFTCCT 回复 coder_PG6ZS5GJ

大神,求代码

2017-09-20 16:43 1

最后一体20%是什么没考虑到吗



2017-09-20 16:44
acmcoderqpE4CSaX 回复 青玉

大神,求代码

2017-09-20 16:46

网页答题真的不习惯啊- -||

2017-09-20 16:47

做的java的     编程题第一题什么鬼....   按照那个公式写的代码没用啊....   

2017-09-20 16:47
coder_vXXfDnia 回复 coder_MUPCA6NF

差不多 可能效率低

2017-09-20 16:48
小码快跑 回复 coder_eA3X2NWX

现在一线互联网企业基本都是在线答题了,慢慢调整~

2017-09-20 16:48

前端第一道(最长非公共字符串):

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]);
    }
}


2017-09-20 16:49
4

Java,分布式,高性能的第二道幸运数的怎么写能AC,来段AC了的

2017-09-20 16:51

题目一:最长非公共子串

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;
}


2017-09-20 16:54
1
青玉 回复 青玉

全部AC = = 话说题目这么简单 我真的很虚 顺丰科技应该招满了吧

2017-09-20 16:57
青玉 回复 acmcoderqpE4CSaX

贴了代码 在评论区

2017-09-20 16:57 1
coder_7HP7EJ57 回复 coder_XNTiY1yz

是木木的密码吗?

2017-09-20 16:57
青玉 回复 coder_XNTiY1yz

是不是木木的密码 = = 你看看我的代码就知道了

2017-09-20 16:58 1

第二题幸运数字问题  没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);


        }
    }



}


2017-09-20 17:00
coder_XNTiY1yz 回复 coder_7HP7EJ57

妈蛋题看错了… 刚才才发现… 炸了炸了… 啊啊啊啊啊啊啊啊

2017-09-20 17:02

幸运数


 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);
	       
	    }


2017-09-20 17:05
1
coder_TYFH6TQW 回复 coder_XNTiY1yz

卧槽,题目意思到底是什么啊?

2017-09-20 17:07

第二题幸运数问题

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);

    }
}


2017-09-20 17:08
coder_XNTiY1yz 回复 coder_TYFH6TQW

A[i] = B[i] + B[i+1] 这样的… 可是它题目写的是A[i] = B[i] - B[i+1] + B[i+2]+… 我特么 这样的代码实现出来怎么也得不到那串数… 很懵逼啊…

2017-09-20 17:19
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);

        }

    }

}


抛砖引玉一下,答完了才写出来的,也不知道对不对


2017-09-20 18:20
coder_9AWANR6U 回复 coder_UV3SZW82

不超时吗

2017-09-20 19:21 1
coder_5262X9qS 回复 coder_9AWANR6U

严重超时, 而且比一般的从3开始自增遍历验证慢多了

2017-09-21 09:59
coder_5262X9qS 回复 coder_GA9vAf2R

大神好厉害, 我当时也没有做出来, 我看了你的代码, 感觉你发现的规律很巧妙, 我的思路是煤油显式的找出最大的幸运数, 而是在找最大的幸运数的过程中累计符合条件的幸运数的个数, 详情可以看我在13楼的代码.

2017-09-21 19:26
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;
	}
}


2017-09-21 19:27
coder_5262X9qS 回复 coder_IVULyVQW

我打开邮箱, 三个字映入眼帘"很遗憾…"

2017-09-21 19:29
coder_5262X9qS 回复 coder_5262X9qS

14楼有精简版

2017-09-21 21:41
         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;
	}


2017-09-21 21:42
添加回复
回到顶部