小红书面试

  1. 如何判断单链表有环

 1public boolean IsLoop(Node head){
 2  Node fast = head;
 3  Node slow = head;
 4  if(head = null){
 5    return false;
 6  }
 7  
 8  while(fast != null&& slow = null){
 9    fast = fast.next.next;
10    slow = slow.next;
11    if(fast = slow){
12      return true;
13    }
14  }
15  
16  return false;
17}
  1. 三次握手, 为什么要三次

    A -> B SYN=1, seq = x;

    A <- B SYN = 1, ACK=1, seq = y, ack = x+1;

    A-> B SYN = 1, ACK =1, seq = x+1, ack = y+1;

    • 实现信息对等,双方的收发报文能力
    • 防止脏连接
  2. TCP/UDP

    TCP 是面向连接的可靠传输,具有流量控制和拥塞避免

    UDP 是不可靠的,

  3. 线程和进程

    进程是资源分配的最小单元

    线程是调度的最小单元

  4. 二叉树先序遍历,递归和非递归

    1// 递归先序遍历
    2public void preOrder(TreeNode node){
    3  if(node == null ){
    4    return;
    5  }
    6  System.out.print(node.val);
    7  preOrder(node.left);
    8  preOrder(node.right);
    9}
    
     1public void preOrder(TreeNode root){
     2  if(root==null){
     3    return;
     4  }
     5
     6  Stack<TreeNode> stack = new Stack<>();
     7  stack.push(root);
     8
     9  while(!stack.isEmpty()){
    10    TreeNode node = stack.pop();
    11    System.out.print(node.val);
    12    if(node.left != null){
    13      stack.push(node.left);
    14    }
    15    if(node.right !=null){
    16      stack.push(node.right)
    17    } 
    18  }
    19}
    
  5. map 的扩容,HashMap

    HashMap的容量为 2^n^, 所以每次扩容都为2倍, 在重新分配元素的时候会比较快

  6. 索引的实现

    B+Tree 平衡搜索树

  7. 前缀树

     1class TireNode{
     2  private TireNode[] links;
     3  private final int R = 26;
     4  private boolean isEnd;
     5  public TireNode(){
     6    links = new TireNode[R];
     7  }
     8
     9  public boolean containsKey(char ch){
    10    return links[ch - 'a'] != null;   
    11  }
    12  public TireNode get(char ch){
    13    return links[ch -'a'];
    14  }
    15  public void put(){
    16
    17  }
    18}
    
  8. redis 的好处

存取速度快, 可以保证数据一致性

  1. 一个从1加到n不用循环求和 递归啊
1public static int sum(int n){
2	if (n==1) {
3		return 1;
4	}else {
5		return n+sum(n-1);//加法
6		// return n*sum(n-1); //乘法
7	}
8}
  1. 一个字符串数字结合遇到数字重复前面字符,求第n个字符

  2. Hashmap底层实现+如何扩容

13.二叉树的几种搜索方式 NLR LNR LRN 前中后 层次遍历

14.两种二叉树深搜方式的差别 深度优先搜索算法的实现运用的主要是回溯法,类似于树的先序遍历算法。 广度优先搜索算法借助队列的先进先出的特点,类似于树的层次遍历 https://blog.csdn.net/liupeifeng3514/article/details/83819583

1面

1.编程题:给你一个可以生成0-6随机数的函数,设计一个可以生成0-9随机数的函数

面试官提示的思路是:先生成两位0-6的随机数,然后7进制转10机制,如果转化结果<=39,就用结果对10求余,因为生成0-39的概率是相等的,所以获得0-9的概率也相等

2.编程题:给你两个数组,求并集

3.操作系统:常用的线程调度算法有哪几种?

有先来先服务,最短作业优先,基于优先权的调度算法,时间片轮转等

4.操作系统:线程和进程的区别?

5.操作系统:线程同步有哪几种方式?

线程同步的方式主要有: 临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)。

他们的主要区别和特点如下:

**1)临界区:**通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,

​ 如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

**2)互斥量:**采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。

​ 互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

**3)信号量:**它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

4)事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

2面 1.C++:有哪几种智能指针?

2.C++:简述模板以及为什么使用模板的时候#include<***.hpp>?

3.编程题:用递归和迭代两种方式写反转二叉树

4.编程题:每k个一组反转链表

5.数据库:redis和其他数据库的区别是什么?什么时候选择redis?

5.设计模式:写一个单例模式

3面 1.计算机网络:TCP/IP4层模型有哪4层?

2.计算机网络:mac层寻址过程

3.编程题:从文本中查找敏感词

面试官希望使用前缀树来做这道题

4.编程题:给你一个含有()和[]的字符串,输出括号每对括号的位置下标如(1,2),如果有不合法括号返回空

5.操作系统:有哪几种IO模型?阻塞IO在底层阻塞在了哪里?

拓展 听到的一些别人的问题

1.编程题:第k大的数

2.编程题:判断一个二叉树是不是完全二叉树

3.编程题:反转链表

4.编程题:用栈实现队列

5.编程题:全排列

6.编程题:从二维数组中查找数(每列递增,每行递增)

7.大数问题:找到1亿个数里出现次数前k大的数,内存有限制 ———————————————— 版权声明:本文为CSDN博主「djqueen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u013536232/article/details/100586988