環形連結串列
問題:
思路:建立hashset,把連結串列的每個節點放到集合中,在放入的過程中檢查這個節點是否已經存在,存在則證明存在環。
程式碼實現:
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
while (head != null){
if (set.contains(head))
return true;
set.add(head);
head = head.next;
}
return false;
}
}
相交連結串列
問題:
思路:先把其中一個連結串列的結點都放到一個hashset中,然後檢索hashset,看是否包含這個節點,如果包含,則證明這個節點就是開始相交的節點,輸出答案。
程式碼實現:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set = new HashSet<>();
ListNode temp = headA;//頭指標不方便移動,賦值給temp
while (temp != null){
set.add(temp);
temp = temp.next;
}
temp = headB;
while (temp != null){
if (set.contains(temp))//如果保護這個節點,則直接返回這個節點。
return temp;
temp = temp.next;
}
return null;
}
}
多數元素
問題:
思路:陣列中元素出現的次數很容易讓人想到hashmap,所以把陣列中每個出現的數字以及它們出現的次數放入到hashmap,然後遍歷hashmap,判斷哪個數字出現的次數大於nums.length / 2,是的話就把這個數字輸出。
程式碼實現:
class Solution {
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
//把陣列中的每個數字和對應出現的次數存放到map中
for(Integer i : nums){
Integer count = map.get(i);
count = count == null ? 1 : ++count;
map.put(i,count);
}
//把陣列中
for(Integer i : map.keySet()){
Integer count = map.get(i);
if (count > nums.length / 2)
return i;
}
return 0;
}
}