面试题汇总

字符串

字符串反转

  1. 字符串倒转,时间复杂度和空间复杂度?
    https://leetcode.com/problems/reverse-string/
class Solution {
    public void reverseString(char[] c) {
        for (int i = 0; i < c.length / 2; i++) {
            c[i] = (char) (c[i] ^ c[c.length - i - 1]);
            c[c.length - i - 1] = (char) (c[i] ^ c[c.length - i - 1]);
            c[i] = (char) (c[i] ^ c[c.length - i - 1]);
        }
    }
}

时间复杂度O(n)
空间复杂度O(1)

  1. 含特殊字符不反转
  public static String reverseString3() {
    String s = "AB#$C%D";
    char[] chars = s.toCharArray();

    int i = 0, j = chars.length - 1;
    while (i < j) {
      if ((chars[i] >= 'A' && chars[i] <= 'z') && (chars[j] >= 'A' && chars[j] <= 'z')) {
        chars[i] = (char) (chars[i] ^ chars[j]);
        chars[j] = (char) (chars[i] ^ chars[j]);
        chars[i] = (char) (chars[i] ^ chars[j]);
        i++;
        j--;
        continue;
      }
      if (!(chars[i] >= 'A' && chars[i] <= 'z')) {
        i++;
      }
      if (!(chars[j] >= 'A' && chars[j] <= 'z')) {
        j--;
      }
    }
    return new String(chars);
  }
  1. 345. Reverse Vowels of a String
  2. Reverse String II

字符串匹配

最长公共子序列

  1. 设计一个Cache,大小为10,按照LRU实现put和get方法
    https://leetcode.com/problems/lru-cache/
    整体实现 是 HashMap+双向链表

  2. 设计一个Cache,大小为10,按照LFU实现put和get方法
    https://leetcode.com/problems/lfu-cache/

  3. 从 A、B两个数组各取一个数,求两数差值最小?

nlog(n)解法

public int smallestDifference(int[] A, int[] B) {
        // write your code here
        if (A == null  ||  A.length == 0 || B == null || B.length == 0) {
            return 0;
        }
        
        Arrays.sort(A);
        Arrays.sort(B);
        
        int ai = 0, bi = 0;
        int min = Integer.MAX_VALUE;
        while (ai < A.length && bi < B.length) {
            min = Math.min(min, Math.abs(A[ai] - B[bi]));
            if (A[ai] < B[bi]) {
                ai++;
            } else {
                bi++;
            }
        }
        return min;
    }
  1. N个数组取两个数差值最小?

  2. zookeeper中的leader选举,为什么要leader选举?
    (1)什么是leader选举?
    在zookeeper集群中也是一样,每个节点都会投票,如果某个节点获得超过半数以上的节点的投票,则该节点就是leader节点了。
    (2)我们有一个zookeeper集群,有好几个节点。每个节点都可以接收请求,处理请求。那么,如果这个时候分别有两个客户端向两个节点发起请求,请求的内容是修改同一个数据。比如客户端c1,请求节点n1,请求是set a = 1; 而客户端c2,请求节点n2,请求内容是set a = 2;
    那么最后a是等于1还是等于2呢? 这在一个分布式环境里是很难确定的。解决这个问题有很多办法,而zookeeper的办法是,我们选一个总统出来,所有的这类决策都提交给总统一个人决策,那之前的问题不就没有了么。

参考资料:https://www.cnblogs.com/yuyijq/p/4116365.html

  1. 数据库索引的实现?
    B+数。具体如何分页,可以非常深入
  2. InnoDB和MyISAM的区别
  3. 悲观锁 乐观锁 并发相关的内容
  4. 怎么对IP进行限流,比如某个IP1小时最多访问1万次,写出代码
  5. 自己做的系统如何优化的?
  6. redis pool线程池工作原理?JDK如何实现?
    https://blog.csdn.net/fuyuwei2015/article/details/72758179
  7. redis和memcached的区别
  8. HashMap和ConcurrentHashMap的区别
  9. JVM的OOM能介绍几种情况
  10. Spring ,事务传播机制
  11. redis的选举算法
  12. spring aop的实现原理
    java中常用到的数据结构有哪些
    jvm调优和并发方面;
    concurrenthashmap atomiclong的实现原理
    redis的分块分表,redis 主从实现原理,es分片原理,memerchae 的数据落地怎么实现的,spring的aop实现原理
    treemap和hashmap的区别
    二分查找
  13. 电梯算法,每层有一个value表示可上或可下value层,求A层到B层的最短按键数
    2、java垃圾回收算法
    3、spring中bean的生命周期
    4、谁继承了java的collection接口
    5、collection有什么方法
    jdk1.7 用的是哪种垃圾回收机制 1.8用的是啥
    spring3.x和4.x的区别
    实现一个栈, 有push pop 获取最小值 三个方法 要求 快!
    用过netty么
    hdfs文件默认大小
    set有序么?

一面问了点项目中遇到的问题和解决方案 写了一个懒加载的单例 一个链表反转

动态规划
二叉树
股票的最大利润(一次卖出)
一个数组代表股票每天的价格,可以选择从某一天买入,然后之后的一天卖出,求能够获得的最大收益。
例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。在价格为5的时候买入并在价格为16时卖出,则能获得最大的利润为11.
在这里插入图片描述

1、 归并排序。
2、 数据结构:设计一个hashmap,写明接口和实现。(开地址法解决冲突的方法)
https://blog.csdn.net/m0_38141699/article/details/90481400
3、 树的先序遍历,要求不使用递归实现。
https://blog.csdn.net/m0_38141699/article/details/93032526
4、 速算:6的15次方。
5、 Kmeans的时间复杂度,要有迭代次数。

  1. 写一个函数,输入有序数组,输出哈夫曼树。
public class HuffmanTree {

  public static Node createTree(List<Node> nodes) {

    while (nodes.size() > 1) {
      Collections.sort(nodes, (o1, o2) -> (int) (o2.weight - o1.weight));

      Node node1 = nodes.get(nodes.size() - 1);
      Node node2 = nodes.get(nodes.size() - 2);

      Node parent = new Node(null, node1.weight + node2.weight);
      parent.left = node1;
      parent.right = node2;

      nodes.remove(nodes.size() - 1);
      nodes.remove(nodes.size() - 1);

      nodes.add(parent);
    }
    return nodes.get(0);

  }

  public static void breadthFirst(Node root) {
    if (root == null) {
      return;
    }

    Queue<Node> queue = new LinkedList();
    Node p = root;
    queue.add(p);

    while (!queue.isEmpty()) {
      p = queue.poll();
      System.out.print(p.weight + " ");

      if (p.left != null) {
        queue.add(p.left);
      }

      if (p.right != null) {
        queue.add(p.right);
      }
    }
  }

  public static class Node<E> {

    E data;
    double weight;
    Node left;
    Node right;

    public Node(E data, double weight) {
      this.data = data;
      this.weight = weight;
    }
  }

  public static void main(String[] args) {
    List<Node> nodes = new ArrayList<>();

    nodes.add(new Node("A", 40.0));
    nodes.add(new Node("B", 8.0));
    nodes.add(new Node("C", 10.0));
    nodes.add(new Node("D", 30.0));
    nodes.add(new Node("E", 10.0));
    nodes.add(new Node("F", 2.0));

    Node root = HuffmanTree.createTree(nodes);
    System.out.println(root.weight);
    breadthFirst(root);
  }
}

参考资料:https://blog.csdn.net/bruce_6/article/details/38656413
3. 已知十个数组, 求这十个数组的交集和并集。
4. 矩阵顺时针旋转90度。
5. 已知一个整形数组,数组相邻两个元素之间的差值始终是1或者-1,给定一个数n,在数组中查找n第一次出现的位置。
比如:[1,2,3,2,1,0,-1,0,1,2,3,4,5] 中查找 3

两个链表,存放大数,高位在前。求两个链表的和,存放到一个新的链表里,要写代码的;方法是先转置,然后再按位相加

广告算法:两个排序的数组,求第n 小,说出最优方案
求n个数和输入数的海明距离最大的k个
多路归并

  1. 多个有序的vector求交
    Vector join(vector<vector> data)
    此题就一直双链求交就行了。
  2. 股票交易求最大收益
    如(1,3,2,6,9,7,8)最大收益为9-1=8,只能一次买卖
    1、设计模式;
    2、单态模式的写法;
    3、90度旋转一个二维数组;
    4、比较两个文件中url的不同;
    5、一个人走楼梯,可以一次走一阶、二阶、三阶,n阶楼梯有多少种走法;
    6、以技术问题为主,smarty模板什么的,项目上的问题比较多,尤其是项目中框架的使用;
    7、一张上亿数据表,只存不连续ID和时间,给你一个时间,找出这个时间所对应的ID;
    8、侧重问大数据的问题,纸上实现。
    1、90度旋转一个数组;
    2、比较两个文件中url的不同,然后问执行速度;
    3、完整讲一遍项目中遇到的MySQL双机双备;
    4、快速排序算法怎么用PHP实现;
    5、树的非递归后序排序算法;
    6、分表,系统运行时修改表结构。
    第一个题目:递归算法;
    第二个题目:排序算法;
    第三个题目是:一个人要去往B地,现在到达一个岔道口,分别是A地和B地,这时遇到两个人,已知一人是A地,另一人是B地,而且一人说真话,一人说假话,请用最少的问法知道那条路是B地;
    第四个题目:用9个点化10条直线,每条直线至少包含3个点;
    第五个题目:已知你有无穷多的水,现在有两个提桶,一个装满水是3公升,一个装满水是5公升,这两个桶形状都不一样,怎么得到4公升的水;
  3. 让实现一个字符串函数,能够写出

2.对于一个文件系统,如何实现快照?
设定条件:假设文件系统操作只有如下三种:
a)创建删除文件
b)追加写
3.hbase的压缩存储是如何实现的
4.mapreduce为什么设计成map和reduce两个阶段
5.代码题:字符串模糊匹配,假设有字典库,里面有1000万个字符串,前端发送来一个字符串,如何能快速得到字典库中与之匹配度最高的字符串。
匹配度假设可以通过一个match(str, target_str)函数得到

代码题:1->3->4->8 + 3->4 = 1->3->8->2
缓存和数据库的基础题

redis数据hash的实现原理

1.AB#$C%D 翻转字母顺序,符号顺序不变
2.一个数组先上升后下降,找到最大值
3.千万级用户,有积分系统,积分排名,前1000面的排名精确,后面的排名不要求,积分会频繁变化
4.java的wait notify使用
5.mq系统的使用,处理重复发送 消息丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值