演算法題
阿新 • • 發佈:2020-08-15
##約瑟夫環問題
有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
解題思路:把其想象成積木一樣,每數到3時從中摘取一塊積木,在之後的積木的順序重新排列,一直這樣迴圈往復直到只剩下一個積木。
首先定義一個int變量表示其從第幾個報數(如果從第一個·開始,把其定義為0)然後迴圈遍歷直到陣列的長度變為1。如果k<0,
讓其把隊尾刪除。具體程式碼如下:
public static void main(String[] args) {
int num = new Scanner(System.in).nextInt(); //初始化人數 ArrayList<Integer> start = new ArrayList<Integer>(); for(int i=1;i<=num;i++) { start.add(i); } //從第k個數開始計數 int k = 0;//從第一個人開始計數 while(start.size() > 0) { k = k + 3; //第m人的索引位置,因為索引是從0開始,進行取餘是因為防止k大於圈中人的總數 k = k % (start.size()) - 1;
// System.out.print(k+" ");
if(k < 0) {
// System.out.print(start.get(start.size()-1)+" ");
start.remove(start.size() - 1);
k = 0;
}else {
System.out.print(start.get(k)+" "); start.remove(k); } } System.out.println(); System.out.println(start.get(0)+" "); }
兩數之和
給定一個整數陣列 nums
和一個目標值 target
,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
public int[] twoSum(int[] nums, int target) { int[] indexs = new int[2]; // 時間複雜度i // 建立k-v ,一一對應的雜湊表 HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>(); for(int i = 0; i < nums.length; i++){ if(hash.containsKey(nums[i])){ indexs[0] = i; indexs[1] = hash.get(nums[i]); return indexs; } // 將資料存入 key為補數 ,value為下標 hash.put(target-nums[i],i); } // 雙重迴圈 時間複雜度i*j // for(int i = 0; i < nums.length; i++){ // for(int j = nums.length - 1; j > i; j --){ // if(nums[i]+nums[j] == target){ // indexs[0] = i; // indexs[1] = j; // return indexs; // } // } // } return indexs; }