1. 程式人生 > 實用技巧 >演算法題

演算法題

​##約瑟夫環問題

有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;
    }