今日头条笔试第一题求解

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的解法就感激不尽啦

全部评论
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
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
// 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
hashset去重会生成hash码进行比较这样会耗费很多时间
点赞 回复 分享
发布于 2018-03-25 00:32
#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
python一行 return len(set([i + k for i in x])& set( y))
点赞 回复 分享
发布于 2018-03-24 21:35
def diff_list(lst , k):     newlst = [i +k for i in lst]     return len(set(lst) & set(newlst)) 再把输入定义一下,AC
点赞 回复 分享
发布于 2018-03-24 21:33
#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
#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
只能用bitset啊...其他都过不了
点赞 回复 分享
发布于 2018-03-24 21:23
#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

相关推荐

不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
码农索隆:想看offer细节
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务