在Java面试中,排列组合问题是一种常见的数据结构与算法题型。这类问题不仅考察应聘者对基本算法的理解,还考察其逻辑思维和编程能力。以下将揭秘Java面试中必考的十大排列组合面试题,帮助您轻松应对职场挑...
在Java面试中,排列组合问题是一种常见的数据结构与算法题型。这类问题不仅考察应聘者对基本算法的理解,还考察其逻辑思维和编程能力。以下将揭秘Java面试中必考的十大排列组合面试题,帮助您轻松应对职场挑战。
题目描述:给定一个无重复数字的数组,返回其所有可能的排列。
解答思路:使用DFS算法遍历所有可能的排列。
public List> permute(int[] nums) { List> result = new ArrayList<>(); List path = new ArrayList<>(); dfs(nums, 0, path, result); return result;
}
private void dfs(int[] nums, int index, List path, List> result) { if (index == nums.length) { result.add(new ArrayList<>(path)); return; } for (int i = 0; i < nums.length; i++) { if (path.contains(nums[i])) { continue; } path.add(nums[i]); dfs(nums, index + 1, path, result); path.remove(path.size() - 1); }
}
题目描述:给定一个字符串,返回其所有可能的排列。
解答思路:使用回溯算法遍历所有可能的排列。
public List permute(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
}
private void swap(char[] chars, int i, int j) { char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp;
} 题目描述:给定一个无重复数字的数组,返回其所有可能的全排列。
解答思路:使用DFS算法遍历所有可能的全排列。
public List> permuteUnique(int[] nums) { List> result = new ArrayList<>(); List path = new ArrayList<>(); Arrays.sort(nums); dfs(nums, 0, path, result); return result;
}
private void dfs(int[] nums, int index, List path, List> result) { if (index == nums.length) { result.add(new ArrayList<>(path)); return; } for (int i = index; i < nums.length; i++) { if (i != index && nums[i] == nums[index]) { continue; } path.add(nums[i]); dfs(nums, i + 1, path, result); path.remove(path.size() - 1); }
}
题目描述:给定一个字符串,返回其所有可能的排列。
解答思路:使用DFS算法遍历所有可能的排列。
public List permuteString(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
} 题目描述:给定一个数字n和一个范围1到n,返回所有可能的组合。
解答思路:使用DFS算法遍历所有可能的组合。
public List> combine(int n, int k) { List> result = new ArrayList<>(); List path = new ArrayList<>(); dfs(n, 1, k, path, result); return result;
}
private void dfs(int n, int start, int k, List path, List> result) { if (path.size() == k) { result.add(new ArrayList<>(path)); return; } for (int i = start; i <= n; i++) { path.add(i); dfs(n, i + 1, k, path, result); path.remove(path.size() - 1); }
}
题目描述:给定一个数字n和一个范围1到n,返回所有可能的组合。
解答思路:使用回溯算法遍历所有可能的组合。
public List> combineUnique(int n, int k) { List> result = new ArrayList<>(); List path = new ArrayList<>(); Arrays.sort(n); backtrack(n, 1, k, path, result); return result;
}
private void backtrack(int[] n, int start, int k, List path, List> result) { if (path.size() == k) { result.add(new ArrayList<>(path)); return; } for (int i = start; i <= n.length; i++) { if (i != start && n[i] == n[start]) { continue; } path.add(n[i]); backtrack(n, i + 1, k, path, result); path.remove(path.size() - 1); }
}
题目描述:给定一个字符串,返回其所有可能的组合。
解答思路:使用DFS算法遍历所有可能的组合。
public List combineString(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
} 题目描述:给定一个字符串,返回其所有可能的排列。
解答思路:使用DFS算法遍历所有可能的排列。
public List permuteString(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
} 题目描述:给定一个字符串,返回其所有可能的组合。
解答思路:使用DFS算法遍历所有可能的组合。
public List combineString(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
} 题目描述:给定一个字符串,返回其所有可能的排列。
解答思路:使用DFS算法遍历所有可能的排列。
public List permuteString(String s) { List result = new ArrayList<>(); char[] chars = s.toCharArray(); Arrays.sort(chars); backtrack(chars, 0, result); return result;
}
private void backtrack(char[] chars, int start, List result) { if (start == chars.length) { result.add(new String(chars)); return; } for (int i = start; i < chars.length; i++) { if (i != start && chars[i] == chars[start]) { continue; } swap(chars, start, i); backtrack(chars, start + 1, result); swap(chars, start, i); }
}