今日头条笔试第一题求解

import java.util.*;

public class Main{
    public static void main(String[] args) {
        int n,k;
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        k=scanner.nextInt();
        Set<Integer> hashSet=new HashSet<>();

        int temp;
        int cnt=0;
        for (int i=0;i<n;i++) {
            temp=scanner.nextInt();
            if (hashSet.contains(temp))
                continue;
            else{
                hashSet.add(temp);
                if (hashSet.contains(temp-k))
                    cnt++;
                if (k!=0&&hashSet.contains(temp+k))
                    cnt++;
            }
        }

        System.out.println(cnt);
    }
}

请问这个算法的问题出在哪?超时了。
另外如果有大牛可以发布一下ac的解法就感激不尽啦

全部评论
#include <iostream>   #include <stdio.h>   #include <string.h>   #include <stack>   #include <queue>   #include <map>   #include <set>   #include <vector>   #include <math.h>   #include <bitset>   #include <algorithm>   #include <climits>   using namespace std;      #define lson 2*i   #define rson 2*i+1   #define LS l,mid,lson   #define RS mid+1,r,rson   #define UP(i,x,y) for(i=x;i<=y;i++)   #define DOWN(i,x,y) for(i=x;i>=y;i--)   #define MEM(a,x) memset(a,x,sizeof(a))   #define W(a) while(a)   #define gcd(a,b) __gcd(a,b)   #define LL long long   #define N 1000005   #define MOD 1000000007   #define INF 0x3f3f3f3f   #define EXP 1e-8   #define lowbit(x) (x&-x)   int main(){     int m,k;     cin>>m>>k;     int sum=0;     char s[100000010];     int d;     for(int i=0;i<m;i++){         scanf("%d",&d);         s[d]='1';     }      for(int i=0;i<=100000000;i++){         if(s[i]=='1'&& s[i+k]=='1')             sum++;     }     cout<<sum<<endl; }  //5 2 //1 5 3 4 2
点赞 回复 分享
发布于 2018-03-24 21:22
只能用bitset啊...其他都过不了
点赞 回复 分享
发布于 2018-03-24 21:23
#include <iostream>  #include<vector> #include<algorithm> using namespace std; int main() {     int m, n,x,i,k;     vector<int> vec1,vec;     int count=0;     while (cin >> m >>k) {         for(i=0;i<m;i++){             cin>>x;             vec1.push_back(x);         }        sort(vec1.begin(), vec1.end());        vec.push_back(vec1[0]);        for(i=1;i<m;i++){           if(vec1[i]!=vec1[i-1])               vec.push_back(vec1[i]);        }        m=0;        n=1;        while(m<n&&n<vec.size()){            if(vec[n]-vec[m]==k){                count++;                m++;                n++;            }            else if(vec[n]-vec[m]>k){                m++;            }            else{                n++;            }        }             if(vec[n]-vec[n-1]==k)                 count++;        cout<<count<<endl;        vec.clear();        vec1.clear();     }     return 0; }
点赞 回复 分享
发布于 2018-03-24 21:29
#include<iostream> #include<set> #include<unordered_map> using namespace std; int main() {     int n, k;     cin >> n >> k;     int tmp;     set<int> input;     for (int i = 0; i < n; ++i) {         cin >> tmp;         input.insert(tmp);     }     unordered_map<int, int> hashmap;     int count = 0;     for (auto i = input.begin(); i != input.end(); i++)     {         if (hashmap[*i - k] == *i)             count++;         else             hashmap[*i - k] = *i;         if (hashmap[*i] == *i + k)             count++;         else             hashmap[*i] = *i + k;     }     cout << count;     return 0; }
点赞 回复 分享
发布于 2018-03-24 21:32
def diff_list(lst , k):     newlst = [i +k for i in lst]     return len(set(lst) & set(newlst)) 再把输入定义一下,AC
点赞 回复 分享
发布于 2018-03-24 21:33
python一行 return len(set([i + k for i in x])& set( y))
点赞 回复 分享
发布于 2018-03-24 21:35
#include <cstdio> #include <map> #include <algorithm> using namespace std; const int MAXN = 1000000; int a[MAXN]; int main() {     //freopen("E:/in.txt", "r", stdin);     int n, k;     scanf("%d%d", &n, &k);     for (int i = 0; i < n; i++)         scanf("%d", &a[i]);     sort(a, a + n);     map<pair<int, int>, int> m;     for (int i = 0; i < n; i++) {         for (int j = i + 1; j < n; j++) {             int t = a[j] - a[i];             if (t == k)                 m[pair<int, int>(a[i], a[j])] = 0;             else if (t > k)                 break;         }     }     printf("%d", m.size());     return 0; }
点赞 回复 分享
发布于 2018-03-24 22:46
hashset去重会生成hash码进行比较这样会耗费很多时间
点赞 回复 分享
发布于 2018-03-25 00:32
// 1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <algorithm> using namespace std; int main() {     int num;//一共有的数字个数     int d;//差值     int sum = 0;     cin>>num>>d;     int a[1000004] = {0};//原数组     for(int i =0; i< num;i ++)     {         cin>>a[i];     }     sort(a,a+num);     //数组去重,笔试死在这一步,默哀。。。     num = unique( a , a+num) - a;     //计数所有的差值     for(int i = 0;i < num; i ++)     {         for(int j = 0;j < num; j ++)         {             if(a[i] == a[j])                 a[j] = a[j+1];             if(a[i] - a[j] == d)                 sum++;         }     }     cout<<sum;     system("pause");     return 0; }
点赞 回复 分享
发布于 2018-03-25 09:13
public static void main(String[] args) {         System.out.println(fun2(new int[2]));                  Scanner scanner = new Scanner(System.in);         int n = scanner.nextInt();         int k = scanner.nextInt();         int[] array = new int[n];         for (int i = 0; i < n; i++) {             array[i] = scanner.nextInt();         }         Arrays.sort(array);         int count = 0;         Map<Integer, Integer> map = new HashMap<>();         for (int i = 0; i < n; i++) {             int start = array[i];             for (int j = i; j < n; j++) {                 if ((array[j] - array[i]) > k) {                     break;                 }                 if ((array[j] - array[i]) == k) {                     map.put(array[i], array[j]);                 }             }                      }         System.out.println(map.keySet().size());              }     // 双指针 也可以解决     public static int fun2 (int[] a) {         a = new int[] {1,1,2,2,2,2,2,3,3,3,3,4};         int k = 1;         Set<Integer> set = new HashSet<>();         for (int i : a) {             set.add(i);         }         Integer[] aa = set.toArray(new Integer[1]);         int n = aa.length;         int r = 0;         int res = 0;         for (int l = 0; l < n; l++) {             while (r < n && aa[r] - aa[l] < k) {                 r++; //             }             if (r >= n) {                 break;             }             if (aa[r] - aa[l] == k) {                 res++;             }                      }         return res;     }
点赞 回复 分享
发布于 2018-03-25 10:26
import java.util.*; import java.util.Arrays; import java.util.HashSet; public class Main1{     public static void main(String[] args) {         Scanner in=new Scanner(System.in);         while(in.hasNext()){             String[] str=in.nextLine().split(" ");             int n=Integer.parseInt(str[0]);             int k=Integer.parseInt(str[1]); //            List<Integer> list = new ArrayList<>();             int[] list = new int[n];             int count=0;             for(int i=0;i<n;i++){                 list[i] = in.nextInt();             }             Arrays.sort(list);             System.out.println(findnum(list, n, k));         }     }          private static int findnum(int[] data, int n, int k){         int begin = 0;         int end  =0;         HashSet<ArrayList<Integer>> chak = new HashSet<ArrayList<Integer>>();         while(end<n && begin<n){             while(end <n-1 && data[end] - data[begin] <k){                 end++;             }             if(data[end]-data[begin]==k){                 ArrayList<Integer> vtemp = new ArrayList<Integer>();                 vtemp.add(data[begin]);                 vtemp.add(data[end]);                 chak.add(vtemp);             }             begin++;         }         return chak.size();     } }
点赞 回复 分享
发布于 2018-03-25 17:15

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务