一起讨论一下搜狐的笔试题(附部分代码)

lz蛋疼,面试完腾讯回来,居然忘了搜狐还有笔试。等到想起来的时候,时间只有70分钟了。花了十分钟把选择题选了,然后做编程题。

  • 第一题,过河问题,dp,但是不知道为何只有60%,没时间多看,直接进第二题
  • 第二题是数字去掉指定个数的数,留下最大的数。循环就可以了。
  • 第三题,钻石,做到这儿只剩20分钟,没时间想优化的方法了,直接暴力,计算从每一个下标开始能得到的最大值。结果20%。。。其它的超时了,还有5分钟时间,直接提交了。这个不知道大家用的什么方法。

第一题过河问题 过了60%,大家帮忙看看问题在哪里。

/**
 * Created by telnetning on 16/9/21.
 */
import java.util.*;

public class sohuT1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = Integer.parseInt(in.nextLine());
        int[] arr = new int[N];
        for(int i = 0; i < N; i++) {
            arr[i] = in.nextInt();
        }

        int[] res = new int[N];
        for(int i = N - 1; i >= 0; i--) {
            if(arr[i] == 0) res[i] = -1;

            int Min = 10000;
            if(arr[i] > N - 1 - i) {
                Min = 1;
            } else {
                int dep = arr[i];
                for(int j = 1; j <= dep; j++) {
                    if(j >= N) break;
                    if(res[i + j] == -1) continue;
                    int s = 1 + res[i + j];

                    //System.out.println(s);
                    if(s < Min) Min = s;
                }
            }

            res[i] = Min;
        }

        System.out.println(res[0]);
    }
}

第二题AC,比较简单:

/**
 * Created by telnetning on 16/9/21.
 */
import java.util.*;

public class sohuT2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int n = in.nextInt();
        System.out.println(handle(str, n));
    }

    public static String handle(String str, int n) {
        int len = str.length();
        char[] arr = str.toCharArray();
        for(int i = 0; i < n; i++) {
            arr = deleteOne(arr);
        }

        return String.valueOf(arr);
    }

    public static char[] deleteOne(char[] arr) {
        int index = arr.length - 1;
        for(int i = 0; i < arr.length - 1; i++) {
            if(arr[i] < arr[i + 1]) {
                index = i;
                break;
            }
        }

        char[] newArr = new char[arr.length - 1];
        for(int i = 0; i < index; i++) {
            newArr[i] = arr[i];
        }

        for(int i = index; i < arr.length - 1; i++) {
            newArr[i] = arr[i + 1];
        }

        return newArr;
    }
}

第三天暴力太丑就不提了。

一起讨论下。

全部评论
第二题是什么思路
点赞 回复 分享
发布于 2016-09-21 17:09
第二题什么思路?
点赞 回复 分享
发布于 2016-09-21 17:12
第二题AC40% 帮忙看下哪里出错了 public static String solution(long n, int m) { String str = String.valueOf(n); if (m >= str.length()) { return null; } for (int i = 0; i < str.length() - 1; i++) { if (str.charAt(i) < str.charAt(i+1)) { str = str.replaceFirst(String.valueOf(str.charAt(i)), ""); m--; i = -1; } if (m <= 0) { break; } } String result =""; if (m > 0) { char[] temp = str.toCharArray(); for (int i = 0; i < temp.length - m; i++) { result += temp[i]; } }else { result = str; } return result; }
点赞 回复 分享
发布于 2016-09-21 17:19
第一题40%,第二题60%,第三题60%。有谁都AC了?为什么赛码网从来没有AC过的题
点赞 回复 分享
发布于 2016-09-21 17:21
项链可以把字符串原样复制一遍,维护一个ABCDE的前缀和,然后二分答案,通过前缀和来验证是否有这五种宝石
点赞 回复 分享
发布于 2016-09-21 17:29
楼主哪个地区的,求腾讯面经!!
点赞 回复 分享
发布于 2016-09-21 17:31
没给测试数据规模,第二题以为这样直接两遍循环会超时呢,原来不会超时呀,看来测试数据没有想象的那么大
点赞 回复 分享
发布于 2016-09-21 17:37
第三题直接输出0也有20%
点赞 回复 分享
发布于 2016-09-21 17:38
过河问题,需要dp吗?每次能跳到的最远的地方,这样就能保证,跳跃次数最少了。感觉可以,但只过60%. import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = Integer.valueOf(in.nextLine()); String s = in.nextLine(); if (n == 0) { System.out.println(-1); continue; } String[] ss = s.split("\\s"); int[] a = new int[ss.length]; for (int i = 0; i < a.length; i++) { a[i] = Integer.valueOf(ss[i]); } int count = 1; int i = 0; for (; i < a.length;) { int step = a[i]; if (a[i] == 0) { System.out.println(-1); break; } if (i + a[i] >= a.length) { System.out.println(count); break; } int j = i + a[i]; for (; j > i && a[j] == 0; j--) { } if (j == i) { System.out.println(-1); break; } else { i = j; count++; } } } } }
点赞 回复 分享
发布于 2016-09-21 18:41
项链问题 package ojtest; import java.util.Scanner; public class Sohu1 { public static int[] exist; public static boolean valid(){ for(int i=0;i<exist.length;i++) if(exist[i]<=0) return false; return true; } public static void add(char c){ if((c-'A')>=0&&('E'-c)>=0) exist[c-'A']++; } public static void remove(char c){ if((c-'A')>=0&&('E'-c)>=0) exist[c-'A']--; } public static int getmax(String str){ char[] chars=str.toCharArray(); int n=chars.length/2; int s=0,e=0,min=n; for(;e<chars.length;){ if(!valid()) add(chars[e++]); else{ min=Math.min(min, e-s); remove(chars[s++]); } } while(valid()){ min=Math.min(min, e-s); remove(chars[s++]); } return n-min; } public static void main(String[] args) { Scanner input=new Scanner(System.in); String str; while(input.hasNextLine()){ str=input.nextLine(); exist=new int[5]; System.out.println(getmax(str+str)); } } }
点赞 回复 分享
发布于 2016-09-21 21:45
删数问题 package onlinetest; import java.util.Scanner; public class Sohu2 { public static void print(int[] res){ for(int i=0;i<res.length;i++) System.out.print(res[i]); System.out.println(); } public static void remove(int[] nums,int[] res,int n,int index,int s){ if(index>=res.length){ print(res); return; } int max=0,delete=0; for(int i=0;i<=n;i++){ if(nums[s+i]>max){ max=nums[s+i]; delete=i; } } res[index]=max; remove(nums,res,n-delete,index+1,s+delete+1); } public static void main(String[] args) { Scanner input=new Scanner(System.in); String str=input.nextLine(); int n=input.nextInt(); char[] chars=str.toCharArray(); int[] nums=new int[chars.length]; for(int i=0;i<chars.length;i++) nums[i]=chars[i]-'0'; int[] res=new int[nums.length-n]; remove(nums,res,n,0,0); } }
点赞 回复 分享
发布于 2016-09-21 21:45
过河问题 package ojtest; import java.util.Scanner; public class Sohu3 { public static int getmin(int[] arr){ if(arr.length==0) return 0; int jump=0,cur=0,next=0; for(int i=0;i<arr.length;i++){ if(cur<i){ jump++; if(cur==next) return -1; cur=next; } next=Math.max(next, i+arr[i]); } return cur>=arr.length?jump:(next>=arr.length?jump+1:-1); } public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); int[] arr=new int[n]; for(int i=0;i<n;i++) arr[i]=input.nextInt(); System.out.println(getmin(arr)); } }
点赞 回复 分享
发布于 2016-09-21 21:45
第一题leetcode原题跳跃游戏2,直接把写过的代码贴上去了,然而只能过80%。。。 第二题宝石,类似于leetcode的minimum window substring,这次能AC了 第三题删数,一个数只要比右边的小就删掉,然后从头重新开始删,如果删到末尾还没删完,表示所有数字已经按降序排列了,只要输出前面若干个就是最大的
点赞 回复 分享
发布于 2016-09-21 22:00
第一题帮朋友做的,AC了 LUCKY BOY<zhang.yun.hao@foxmail.com> 16:26:24 #include<iostream> #include<vector> using namespace std; int main() { int n; cin >> n; vector<int> vec; vector<int> dp(n + 1, -1); for (int i = 0; i < n; i++) { int tmp; cin >> tmp; vec.push_back(tmp); } dp[0] = 0; for (int i = 1; i <= n; i++) { int min = 99999; //从i节点之前找到可以跳到i的一个节点,该节点必须可到达,即不为-1 for (int j = 0; j < i; j++) { if (vec[j] >= i - j) { if (min > dp[j] && dp[j] != -1) min = dp[j]; } } dp[i] = (min == 99999 ? -1 : min + 1); } cout << dp[n] << endl; }
点赞 回复 分享
发布于 2016-09-21 23:57
第一个题leetcode原题jump game2 BFS
点赞 回复 分享
发布于 2016-09-22 02:19

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务