腾讯玄学视频面试-2020.3.29

腾讯主要技术栈是c/cpp/go,所以学java的去面试很难受,上来讨论了项目半个小时,开始就了解到腾讯面试喜欢问网络编程,网络的题大概准备了下,差不多都回答了,后面出了个编程题目,求某范围内的随机不重复的确定多少个数的数,例如她举个例子求1000-1200内不重复的700个数字,以前从没有做个这个类型的题,开始就有点疑惑这范围内只有两百个随机数,咋能产生700个不重复的正数。她叫我自己做,共享了屏幕,他看得到,跟他交流这个题也不咋搭理我,说自己写就行,后来我自己放弃了.下来看了下原理自己实现了下,应该是她说的产生700个数范围是错的。代码如下:

首先要想到怎么产生在一个范围的随机数?

例如:随机生成 1~100 之间的随机数,取值包含边界值 1 和 100。

以 Java 语言为例,我们观察其 Random 对象的 nextInt(int) 方法,发现这个方法将生成 0 ~ 参数之间随机取值的整数。例如(假设先有 Random rand = newRandom();,下同):

rand.nextInt(100);

这行代码将生成范围0~100 之间的随机数,有趣的是,取值可能为 0 ,但不可能为 100。我们用中学数学课学习的区间表示法,表示为:[0, 100)。

那么如果要获得区间 [1~100]的随机数,该怎么办呢?稍微动动脑筋就可以想到:区间 [0, 100) 内的整数,实际上就是区间 [0, 99]。因为最大边界为100,可惜不能等于100,因此最大可能产生的“整数”就是99。

既然rand.nextInt(100) 获得的值是区间 [0, 99],那么在这个区间左右各加 1,就得到了区间 [1, 100]。因此,代码写成:

rand.nextInt(100)+ 1;

观察上面就能看出:最大取值-最小取值 + 1就能得出这个范围;

--最大取值-最小取值+1;

Random rand = new Random();
int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数

不重复就用HashSet来存放,并统计这个set的大小。

package code;

import java.util.*;

/**
 * @author 江河
 * @date 2020-03-29 14:49
 */
public class Main2 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNext()) {
      int min = sc.nextInt();
      int max = sc.nextInt();
      int number = sc.nextInt(); //一个范围内取得个数不重复的
      Set set = new HashSet<>();
      Random rand = new Random();
      while (set.size()<=number) {
        int randNumber = rand.nextInt(max-min+1)+min;
        if(!set.contains(randNumber)) {
          set.add(randNumber);
        }
      }
      //下面统计看结果
      int i=0;
      for (Iterator it = set.iterator(); it.hasNext(); ) {
        System.out.print(" " + it.next().toString());
        i++;
      }
      System.out.println();
      System.out.println(i-1);
    }
  }
}

 

你可能感兴趣的:(公司笔试题,java)