面试题
如何判定一个链表是有环链表?
扩展:<br>1、如何求出环的长度?<br>2、如何求出入环节点?
算法:<br>1、设定两个指针p1、p2,p1指向元素next,p2指向元素next.next<br>2、当p2指向元素不为null,p2.next指向元素不为null,<br>则不停地检测p1,p2所指向元素是否相等,相等则有环
实现一个栈,<br>该栈带有出栈、入栈、取最小元素3个方法,<br>要保证这3个方法的时间复杂度都是O(1)?
算法:<br>1、栈A存储原始数组,栈B存储最小数<br>2、当出栈时,如果栈A和B的栈顶相同,则栈B出栈,当前栈顶仍然有最小元素
求出两个整数的最大公约数?
算法:<br>1、碾转相除法<br>2、更相减损术<br>3、更相减损术+移位算术
如何判断一个数是否为2的整数次幂?
算法:<br>1、num&num-1进行与运算,结果为0则符合
无序数组排序后的最大相邻差?
算法:<br>1、借助桶排序的算法,每个桶统计最大数和最小数<br>2、比较相邻两个不为空的桶的A、B,B的最小值减去A的最大值,就是最大相邻差
如何用栈实现队列?
算法:<br>1、栈A实现入队<br>2、栈A弹出栈的元素,作为栈B的入栈数据,栈B出栈实现出队
找出一个正整数所有数字全排列的下一个数?<br>(核心:字典序算法)
算法:<br>1、假设原始数组A,找出A中倒序的元素下标index<br>2、从A最后一个元素开始比较,比较index-1的元素X,如果X小于最后一个元素,<br>则交换元素<br>3、从A最后一个元素开始比较,比较index的元素Y,如果Y大于最后一个元素,<br>则交换元素<br>输出结果,即为全排列的下一个数
给出一个整数,删去k个数字后的最小值?<br>(核心:贪心算法)
普通算法:<br>1、把整数用数组A存储<br>2、循环K次,每次把A从左到右比较大小,<br>当左边元素大于右边元素时,则删掉左边的数字<br>3、打印数组得到结果
进阶算法:<br>1、创建一个整数字符串A长度的栈B,得到A.length-K后的新长度L<br>2、遍历A的元素X在栈B入栈<br>3、如果栈B栈顶的元素大于当前A遍历的元素X,则X覆盖栈顶的元素,相当于让B出栈<br>4、找到栈中第一个非零数字的位置Offset,截取栈B从Offset到L的范围数字,得到结果
如何实现大整数相加?
物理存储结构
数组
查找:时间复杂度O(1)<br>插入:时间复杂度O(n)<br>
扩容:<br>把原来的数组长度 x 2
链表
查找:时间复杂度O(n)<br>插入:时间复杂度O(1)<br>