//小葯葯面試
//題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
*
*/