import java.util.Stack;
/**
* 思路:
* 栈A用来作入队列,栈B用来出队列
* 当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列)
*/
public class Solution18 {
Stack stack1 = new Stack();
Stack stack2 = new Stack();
public void push(int node) {
stack1.push(node);//stack1负责入队
}
public int pop() {
if (stack1.empty() && stack2.empty()) {
throw new RuntimeException("队列为空");
}
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();//stcak2负责出队
}
}
打印入栈的所有情况
返回数组中所有出现两次以上的数
/**
* 直接利用hashmap记录出现次数
*
* @param nums
* @return
*/
public List findDuplicates(int[] nums) {
List res = new ArrayList<>();
if (nums == null || nums.length == 0) {
return res;
}
HashMap map = new HashMap<>();
int count;
for (int val :
nums) {
if (!map.containsKey(val)) {
map.put(val, 1);
} else {
count = map.get(val);
map.put(val, ++count);
}
if (map.get(val) == 2) {
res.add(val);
}
}
return res;
}
/**
* 因为数组输入的特点 1<=a[i]<=n,则可以把原数组当hash表用 ,因为原数组是正数,标为负数表示出现过,如果遇到负数就表示第二次出现,就可以找出所有出现过两次的元素
*
* @param nums
* @return
*/
public List findDuplicates_2(int[] nums) {
List res = new ArrayList<>();
for (int i = 0; i < nums.length; ++i) {
int index = Math.abs(nums[i]) - 1;
if (nums[index] < 0) {
res.add(Math.abs(index + 1));
}
nums[index] = -nums[index];
}
return res;
}
快排
public static void quickSort(int[] array, int _left, int _right) {
int left = _left;//
int right = _right;
int pivot;//基准线
if (left < right) {
pivot = array[left];
while (left != right) {
//从右往左找到比基准线小的数
while (left < right && pivot <= array[right]) {
right--;
}
//将右边比基准线小的数换到左边
array[left] = array[right];
//从左往右找到比基准线大的数
while (left < right && pivot >= array[left]) {
left++;
}
//将左边比基准线大的数换到右边
array[right] = array[left];
}
//此时left和right指向同一位置
array[left] = pivot;
quickSort(array, _left, left - 1);
quickSort(array, left + 1, _right);
}
}
输入一个整数,反转输出:比如输入1234,然后输出4321。
public int reverseInt(int x) {
int ans = 0;
while (x != 0) {
ans = ans * 10 + (x % 10);
x /= 10;
}
if (ans < Integer.MIN_VALUE || ans > Integer.MAX_VALUE) {
ans = 0;
}
return ans;
}
最大合数的质子分解,比如输入20,输出2,2,5
import java.util.Scanner;
public class Main {
/**
* 进行分解质因数
*
* @param number
*/
public static void factor(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
System.out.print(i + " ");
//判断number/i是不是素数,如果是素数就直接输出
if (isPrime(number / i)) {
System.out.print(number / i + " ");
} else {
factor(number / i);
}
return;
}
}
}
/**
* 判断是不是素数
*
* @param number
* @return
*/
public static boolean isPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
链表判断是否有环和找入环的节点。
import java.util.HashSet;
public class Solution24 {
/**
* 假设x为环前面的路程,a为环入口到相遇点的路程, c为环的长度
* 当快慢指针相遇的时候: 此时慢指针走的路程为Sslow = x + m * c + a
* 快指针走的路程为Sfast = x + n * c + a
* 2 Sslow = Sfast
* 2 * ( x + m*c + a ) = (x + n *c + a)
* 从而可以推导出: x = (n - 2 * m )*c - a = (n - 2 *m -1 )*c + c - a
* 即环前面的路程 = 数个环的长度(为可能为0) + c - a
* 什么是c - a?这是相遇点后,环后面部分的路程。
* 所以,我们可以让一个指针从起点A开始走,让一个指针从相遇点B开始继续往后走, 2个指针速度一样,
* 那么,当从原点的指针走到环入口点的时候(此时刚好走了x) 从相遇点开始走的那个指针也一定刚好到达环入口点。
* 所以两者会相遇,且恰好相遇在环的入口点。
*
* @param pHead
* @return
*/
public ListNode EntryNodeOfLoop_2(ListNode pHead) {
if (pHead == null || pHead.next == null || pHead.next.next == null)
return null;
ListNode fast = pHead.next.next;
ListNode slow = pHead.next;
//先判断有没有环
while (fast != slow) {
if (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
} else {
//没有环
return null;
}
}
fast = pHead;//把fast指向头节点
//有环
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
/**
* 利用HashSet元素不能重复
*
* @param pHead
* @return
*/
public ListNode EntryNodeOfLoop(ListNode pHead) {
HashSet hashSet = new HashSet<>();
while (pHead != null) {
if (!hashSet.add(pHead)) {
return pHead;
}
pHead = pHead.next;
}
return null;
}
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
}
数组中出现次数超过一半的数字
import java.util.HashMap;
public class Solution42 {
/**
* 利用 Boyer-Moore Majority Vote Algorithm(摩尔投票算法)来解决这个问题
*
* @param array
* @return
*/
public int MoreThanHalfNum_Solution_2(int[] array) {
int majority = array[0];
for (int i = 1, count = 1; i < array.length; i++) {
count = array[i] == majority ? count + 1 : count - 1;
if (count == 0) {
majority = array[i];
count = 1;
}
}
int count = 0;
for (int val : array) if (val == majority) count++;
return count > array.length / 2 ? majority : 0;
}
/**
* 利用HashMap记录每个数字以及数字出现的次数
*
* @param array
* @return
*/
public int MoreThanHalfNum_Solution(int[] array) {
if (array == null || array.length == 0)
return 0;
HashMap map = new HashMap<>();
int count;
for (int val :
array) {
if (!map.containsKey(val)) {
map.put(val, 1);
} else {
count = map.get(val);
map.put(val, ++count);
}
if (map.get(val) > array.length / 2) {
return val;
}
}
return 0;
}
}
堆,如何调整,时间复杂度?
括号匹配
二叉搜索树遍历
单链表的快速排序
二叉树压缩序列化,并能够重建,保证最小复杂度
和为S的两个数字
import java.util.ArrayList;
import java.util.HashMap;
public class Solution34 {
/**
* 两头夹逼
*
* @param array
* @param sum
* @return
*/
public ArrayList FindNumbersWithSum(int[] array, int sum) {
ArrayList result = new ArrayList<>();
int left = 0;
int right = array.length - 1;
while (left < right) {
if (array[left] + array[right] == sum) {
result.add(array[left]);
result.add(array[right]);
break;
} else if (array[left] + array[right] > sum) {
right--;
} else {
left++;
}
}
return result;
}
/**
* 用HashMap存放元素和下标,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。
*
* @param array
* @param sum
* @return
*/
public ArrayList FindNumbersWithSum_2(int[] array, int sum) {
HashMap map = new HashMap<>();
ArrayList result = new ArrayList<>();
int len = array.length;
for (int i = 0; i < len; i++) {
map.put(array[i], i);
}
for (int i = 0; i < len; i++) {
int sub = sum - array[i];
if (map.containsKey(sub)) {
result.add(array[i]);
result.add(sub);
break;
}
}
return result;
}
}
如何找回文?
去重,考虑各种不同的输入
一块区域很多很多点,如何统计某一小块区域的点的个数。
内存很小的情况下,两个大文件的数据之间怎么映射
归并
四、操作系统
线程&&进程区别,什么情况下多进程要优于多线程
进程是资源分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
HTTPS(Secure Hypertext Transfer Protocol) 安全超文本传输协议是一个安全的通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。HTTPS使用安全套接字层(SSL)进行信息交换,简单来说HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword' WI
TH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作
在 Service Pack 4 (SP 4), 是运行 Microsoft Windows Server 2003、 Microsoft Windows Storage Server 2003 或 Microsoft Windows 2000 服务器上您尝试安装 Microsoft SQL Server 2000 通过卷许可协议 (VLA) 媒体。 这样做, 收到以下错误信息CD KEY的 SQ
OS 7 has a new method that allows you to draw a view hierarchy into the current graphics context. This can be used to get an UIImage very fast.
I implemented a category method on UIView to get the vi
方法一:
在my.ini的[mysqld]字段加入:
skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>更新 user set password=password('新密码') WHERE User='root';
mysq
背景
2014年11月12日,ASP.NET之父、微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行。.NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR、JIT编译器、垃圾收集器(GC)和核心