虾皮一面面经
- 线程和进程的区别
- TCP和UDP的区别, TCP如何定义一个连接
- 数组和链表的区别以及选择
- 双亲委派模型,什么时候我们需要打破双亲委派模型,以及怎么样去做
- 一亿数据里去找Top 100 数据 (包括二叉堆如何进行下沉操作)
- 实现一个 [pop push getMax(得到当前栈中最大值)] O(1) 时间复杂度 的栈结构双栈,双栈的具体内部push pop细节
- 判断一个单链表是否有环, 如何计算环的大小(给了我快指针走了2b ,慢指针走了b。我给出答案b。实际计算不出来,被坑了,给了个大概思路,忘记快指针不只走一圈了。 但是可以通过找到环的起点之后遍历得到。出自楼下兄弟的提醒)
- 算法题输入一个只包含xyz的一个字符串,输出满足x,y,z都至少出现过一次的子字符串的数量。滑动窗口解决。
import java.util.Scanner;
/**
* 输入一个只包含xyz的一个字符串,输出满足x,y,z都至少出现过一次的子字符串的数量。
*
* 示例:
*
* 输入:str = “xxxyz”
*
* 输出:3
*
* 解释:分别为“xxxyz”,“xxyz”,“xyz”
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int[] window = new int[3]; // x, y, z
int valid = 0; // valid == 3
int n = s.length();
int l = 0, r = 0;
int res = 0;
while (r < n) {
char c = s.charAt(r);
r++;
if (c == 'x' || c == 'y' || c == 'z') {
int index = c - 'x';
window[index]++;
if (window[index] == 1) {
valid++;
}
}
while (valid == 3) {
int count = n - r + 1;
res += count;
char d = s.charAt(l);
l++;
if (d == 'x' || d == 'y' || d == 'z') {
int index = d - 'x';
if (window[index] == 1) {
valid--;
}
window[index]--;
}
}
}
System.out.println(res);
}
}
9.总结: 没有针对项目进行提问,主要拷打算法,常见算法的具体实现还需要再巩固。
#虾皮##秋招java##秋招#
查看12道真题和解析