//小药药面试
//题1: 一个数组 int[] A = {2,3,0,-2,-6,23,0,4,4......n} 如何把里面所有的正数放在左侧,0 放在中间,负数放在右侧? (基于 三色排序法 )
//题2: 数组 {1,1,2,3,5,8,13,21,34,..........n}.如何计算出 f(100) (递归)
//题3: try/catch/finally,finally总会执行么?如果 try / catch 里 return, finally 还执行么?
//题4:线程安全怎么实现的?synchronized 那是怎么实现安全的?一般是加在哪些线程上?一般加到哪些线程上才能保证既是同步的,也不冲突?
//题5:ArrayList 和链表 (LinkedList) 的区别
//题6:如何实现序列化
//题7:如何连接数据库,有哪些参数
//题8:如何访问 Excel 表中某个行列的某个数据? 用的那个包?
//题9:用过 java 反射么? java 反射的原理的?和类的实例化有。。。?是如何做到反射的?
//题10: 工作中都用到 java 哪些类?
//
// 没有 api: 都是自己去抓, 接口测试和 ui 都有。
// 用 fiddler 验证接口消息对不对,然后用 java/python写脚本。用 java 方法发请求。。。
package sort.algorithm;
public class XiaoYaoYaoInterview
{
public static void main(String[] args)
{
//第一题
int[] a = {3,2,0,-2,-3,0,-7,0,-3,55,23,1};
Q1_Way1(a);
Q1_Way2_ThreeColorSort(a);
//第二题: https://blog.csdn.net/qq_41532872/article/details/85160344
System.out.println("Result of the recursion is:" + Q2_recursion(8));
}
//题一,方法一,用到两个数组。第一个(也就是要处理的数组),先计算出多少个>0 =0 <0 的,比如分别是 i,j,k 个。
//然后第二个数组是个同尺寸的空的,把第一个取出的值一个一个检验后放进去,对于>0 的从新数组的头开始放。=0 的从位置 i 开始放。
//<0 的,从 i+j 开始放。
public static void Q1_Way1(int[] a)
{
int len = a.length;
int i=0;//>0
int j=0;//=0
int k=0;//<0
for(int p=0; p < len; p++)
{
if(a[p] > 0)
{
i++;
}
else if (a[p]==0)
{
j++;
}
else {
k++;
}
}
System.out.println("i="+i+" j="+j+" k="+k);
int[] b = new int[len]; //同尺寸新 array
int iCount=0;//>0 的计数
int jCount=0;//=0 的计数
int kCount=0;//<0 的计数
for(int q = 0; q < len; q++)
{
if(a[q]>0)
{
b[iCount] = a[q];
iCount++;
}
else if (a[q]==0)
{
b[i+jCount]=a[q];
jCount++;
}
else {
b[i+j+kCount]=a[q];
kCount++;
}
}
for (int bb : b)
{
System.out.print(bb+" ");
}
System.out.println("");
}
/**
* 题一,方法2,就是操作当前数组。设置两个下标(指针) p0/p1, p0 从头往后扫,p1从后往前扫
* 参见: 算法练习:两指针之三色排序 (https://blog.csdn.net/s634772208/article/details/46740191)
*/
public static void Q1_Way2_ThreeColorSort(int[] AA)
{
int p0 = 0;
int p1 = AA.length -1;
int i = 0;
while (i <= p1)
{
//当前值为负数,与尾指针p1指向的值相互交换,p1向前移动一位, i、p0 位置不变
if(AA[i]<0)
{
int temp = AA[i];
AA[i] = AA[p1];
AA[p1] = temp;
p1--;
}
//当前值为正数,与首指针p0指向的值相互交换,p0 向后移动一位, i、p1位置不变
else if (AA[i]>0 && i>p0)
{
int temp = AA[i];
AA[i] = AA[p0];
AA[p0] = temp;
p0++;
}
//当前值为 0,i 要向后移动一位,p0、p1位置不变。
else
{
i++;
}
}
for (int A : AA)
{
System.out.print(A + " ");
}
System.out.println("");
}
public static void switchNums (int a, int b)
{
int temp = a;
a = b;
b = temp;
}
//题二:采用递归
public static int Q2_recursion(int a)
{
if(a<1)
{
System.out.println("!Check input. Should be a positive integer.");
return 0;
}
else if(a>0 && a<3)
{
return 1;
}
else
{
return Q2_recursion(a-1) + Q2_recursion(a-2);
}
}
}
/*** 题三:
* finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。而且finally也会捕获异常!当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了 System.exit() 退出程序。
3)程序所在的线程死亡。
4)关闭CPU。
*/
/***题四:
* 多线程 synchronized
*
*/
//题1: 一个数组 int[] A = {2,3,0,-2,-6,23,0,4,4......n} 如何把里面所有的正数放在左侧,0 放在中间,负数放在右侧? (基于 三色排序法 )
//题2: 数组 {1,1,2,3,5,8,13,21,34,..........n}.如何计算出 f(100) (递归)
//题3: try/catch/finally,finally总会执行么?如果 try / catch 里 return, finally 还执行么?
//题4:线程安全怎么实现的?synchronized 那是怎么实现安全的?一般是加在哪些线程上?一般加到哪些线程上才能保证既是同步的,也不冲突?
//题5:ArrayList 和链表 (LinkedList) 的区别
//题6:如何实现序列化
//题7:如何连接数据库,有哪些参数
//题8:如何访问 Excel 表中某个行列的某个数据? 用的那个包?
//题9:用过 java 反射么? java 反射的原理的?和类的实例化有。。。?是如何做到反射的?
//题10: 工作中都用到 java 哪些类?
//
// 没有 api: 都是自己去抓, 接口测试和 ui 都有。
// 用 fiddler 验证接口消息对不对,然后用 java/python写脚本。用 java 方法发请求。。。
package sort.algorithm;
public class XiaoYaoYaoInterview
{
public static void main(String[] args)
{
//第一题
int[] a = {3,2,0,-2,-3,0,-7,0,-3,55,23,1};
Q1_Way1(a);
Q1_Way2_ThreeColorSort(a);
//第二题: https://blog.csdn.net/qq_41532872/article/details/85160344
System.out.println("Result of the recursion is:" + Q2_recursion(8));
}
//题一,方法一,用到两个数组。第一个(也就是要处理的数组),先计算出多少个>0 =0 <0 的,比如分别是 i,j,k 个。
//然后第二个数组是个同尺寸的空的,把第一个取出的值一个一个检验后放进去,对于>0 的从新数组的头开始放。=0 的从位置 i 开始放。
//<0 的,从 i+j 开始放。
public static void Q1_Way1(int[] a)
{
int len = a.length;
int i=0;//>0
int j=0;//=0
int k=0;//<0
for(int p=0; p < len; p++)
{
if(a[p] > 0)
{
i++;
}
else if (a[p]==0)
{
j++;
}
else {
k++;
}
}
System.out.println("i="+i+" j="+j+" k="+k);
int[] b = new int[len]; //同尺寸新 array
int iCount=0;//>0 的计数
int jCount=0;//=0 的计数
int kCount=0;//<0 的计数
for(int q = 0; q < len; q++)
{
if(a[q]>0)
{
b[iCount] = a[q];
iCount++;
}
else if (a[q]==0)
{
b[i+jCount]=a[q];
jCount++;
}
else {
b[i+j+kCount]=a[q];
kCount++;
}
}
for (int bb : b)
{
System.out.print(bb+" ");
}
System.out.println("");
}
/**
* 题一,方法2,就是操作当前数组。设置两个下标(指针) p0/p1, p0 从头往后扫,p1从后往前扫
* 参见: 算法练习:两指针之三色排序 (https://blog.csdn.net/s634772208/article/details/46740191)
*/
public static void Q1_Way2_ThreeColorSort(int[] AA)
{
int p0 = 0;
int p1 = AA.length -1;
int i = 0;
while (i <= p1)
{
//当前值为负数,与尾指针p1指向的值相互交换,p1向前移动一位, i、p0 位置不变
if(AA[i]<0)
{
int temp = AA[i];
AA[i] = AA[p1];
AA[p1] = temp;
p1--;
}
//当前值为正数,与首指针p0指向的值相互交换,p0 向后移动一位, i、p1位置不变
else if (AA[i]>0 && i>p0)
{
int temp = AA[i];
AA[i] = AA[p0];
AA[p0] = temp;
p0++;
}
//当前值为 0,i 要向后移动一位,p0、p1位置不变。
else
{
i++;
}
}
for (int A : AA)
{
System.out.print(A + " ");
}
System.out.println("");
}
public static void switchNums (int a, int b)
{
int temp = a;
a = b;
b = temp;
}
//题二:采用递归
public static int Q2_recursion(int a)
{
if(a<1)
{
System.out.println("!Check input. Should be a positive integer.");
return 0;
}
else if(a>0 && a<3)
{
return 1;
}
else
{
return Q2_recursion(a-1) + Q2_recursion(a-2);
}
}
}
/*** 题三:
* finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。而且finally也会捕获异常!当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了 System.exit() 退出程序。
3)程序所在的线程死亡。
4)关闭CPU。
*/
/***题四:
* 多线程 synchronized
*
*/