java陣列演算法題

2021-09-12 10:39:44 字數 4858 閱讀 1828

1.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。  

輸入[0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。

思路解析:利用slow=0,fast=1,分別指向陣列的第0,1號元素,if(他們相同時),,else

public static int removeduplicates(int nums) 

} return slow + 1;

}

2.給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

輸入: 

[1,2,3,4,5,6,7]

和 k = 3

輸出:

[5,6,7,1,2,3,4]

說明:.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。

.要求使用空間複雜度為 o(1) 的原地演算法。

思路解析:元素後移k次就行了,另一種是利用翻轉,任何陣列翻轉3次即可,還有一種思路新奇

/**

* 翻轉

* 時間複雜度:o(n)

* 空間複雜度:o(1)

*/public void rotate_2(int nums, int k)

private void reverse(int nums, int start, int end)

}/**

* 迴圈交換

* 時間複雜度:o(n^2/k)

* 空間複雜度:o(1)

*/public void rotate_3(int nums, int k)

}}

3.給定乙個整數陣列,判斷是否存在重複元素。

如果任何值在陣列**現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。

輸入: [1,2,3,1]

輸出: true

輸入: [1,2,3,4]

輸出: false

思路解析:我做的是排序然後比較,還有set也比較容易想到,以及map的containkey方法

public boolean containsduplicate(int nums)

4.給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

輸入: [2,2,1]

輸出: 1

思路解析:運用" ^ "運算子,異或的運算方法是乙個二進位制運算: 1^1=0 ;0^0=0 ;1^0=1 ;0^1=1 

public int singlenumber(int nums)  else if (nums1[i] > nums2[j])  else 

} int res = new int[list.size()];

for (int i = 0; i < list.size(); i++)

return res;

}

6.給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位, 陣列中每個元素只儲存乙個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。

輸入: [1,2,3]

輸出: [1,2,4]

解釋: 輸入陣列表示數字 123。

思路解析:如果是9,就相當於該位為0,前一位加1,直到第一位判定是否需要擴容

public int plusone(int digits) else

} int res=new int[len+1];

res[0]=1;

return res;

}

7.給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。

輸入: 

[0,1,0,3,12]

輸出:

[1,3,12,0,0]

說明:. 必須在原陣列上操作,不能拷貝額外的陣列。

. 儘量減少操作次數。

思路解析:其他元素前移佔據0的位置,然後再來補0,還有一種就是利用雙指標交換後直接填充0,這裡的if(i!=j)是為了防止找到0之前i,j相同

public void movezeroes(int nums) 

j++;

} while (i < nums.length) nums[i++] = 0;}//

public void movezeroes(int nums) else

}} }

return true;

}//暴力破解

public static boolean isvalidsudoku(char board)

for(int k = 8; k > i; k--)

for(int k = i + 1; k % 3 != 0; k ++)

}} }

return true;

}

10.給定乙個 n × n 的二維矩陣表示乙個影象。將影象順時針旋轉 90 度。

說明:你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另乙個矩陣來旋轉影象。

給定 matrix = 

[ [1,2,3],

[4,5,6],

[7,8,9]

],原地旋轉輸入矩陣,使其變為:

[ [7,4,1],

[8,5,2],

[9,6,3]

]給定 matrix =

[ [ 5, 1, 9,11],

[ 2, 4, 8,10],

[13, 3, 6, 7],

[15,14,12,16]

], 原地旋轉輸入矩陣,使其變為:

[ [15,13, 2, 5],

[14, 3, 4, 1],

[12, 6, 8, 9],

[16, 7,10,11]

]

思路解析:左下右上連線,元素對換後再映象對稱,這種方法化繁為簡。

public void rotate(int matrix)  else if (nums[l] + nums[r] < sum)  else }}

}return ls;

}

12.給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。

輸入: 

[ [1,1,1],

[1,0,1],

[1,1,1]

]輸出:

[ [1,0,1],

[0,0,0],

[1,0,1]

]高階:

乙個直接的解決方案是使用 o(mn) 的額外空間,但這並不是乙個好的解決方案。

乙個簡單的改進方案是使用 o(m + n) 的額外空間,但這仍然不是最好的解決方案。

你能想出乙個常數空間的解決方案嗎?

思路解析:利用乙個輔助陣列來標記為0的位置,再根據它來做替換。

public void setzeroes(int matrix) 

return new arraylist(ans.values());

}

14.假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0

輸出: 4

思路解析:將陣列一分為二,其中一定有乙個是有序的,另乙個可能是有序,也能是部分有序。此時有序部分用二分法查詢。無序部分再一分為二,其中乙個一定有序,另乙個可能有序,可能無序。就這樣迴圈.

public int search(int nums, int target)

private int search(int nums,int target,int i,int j)

{ if(i>j) return -1;

int mid=i+(j-i)/2;

if(nums[mid]==target) return mid;

if(nums[i]15.給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列**現次數大於⌊ n/2 ⌋的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在眾數。

Java 演算法題筆記(二,二維陣列)

力扣刷到的一題,做一下筆記。思路先找出格仔裡所有腐爛的橘子,然後這些橘子每傳染一次,記深度 1 直到不能再傳染了為止,再去判斷這些橘子裡,是否還有好橘子,如果有則為不能完全傳染,返回 1 如果沒有則為能全部傳完,那就返回深度值。原來,dr,dc 是控制上下左右移動的,這裡寫的是上,左,下,右 pub...

陣列演算法題

思路 使用hashmap儲存,key是每個元素,value是乙個linkedlist,這個鍊錶儲存了key對應所有的元素 即相同的元素 最後遍歷找出linkedlist對應size最大的 public class getmostfrequentinarraylist int result 0 int...

java基礎演算法題

無論什麼時候,面試官都看重程式設計師的演算法基本功,這也是證明自己能力的最直接的方法,所以面試之前一定要多多溫習演算法,最近因為面試我簡單總結了幾個小演算法,編譯執行通過的,如果有什麼錯誤,歡迎指正 v 方法一 使用遞迴演算法 遞迴求階乘 param n return public int fac1...