已排序整型數組,實現二分查找判斷目標值是否存在。
public class SinaTest1 {
public boolean findNum(int[] nums, int target) {
if (nums == null) return false;
return binarySearch(nums, target, 0, nums.length - 1);
}
private boolean binarySearch(int[] nums, int target, int left, int right) {
if (left > right) return false; // 搜索區間為空
int mid = left + (right - left) / 2; // 防止溢出
if (nums[mid] == target) return true;
else if (nums[mid] > target)
return binarySearch(nums, target, left, mid - 1);
else
return binarySearch(nums, target, mid + 1, right);
}
// 迭代版(推薦,無棧溢出風險)
public boolean findNumIterative(int[] nums, int target) {
if (nums == null) return false;
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) >>> 1; // 無符號右移等效除2
if (nums[mid] == target) return true;
else if (nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
return false;
}
}
統計數組中不同數字個數,按出現頻率升序,頻率相同按數值升序,輸出新數組。
public class SinaTest2 {
public int[] distinctNum(int[] nums) {
if (nums == null) return new int[0];
// 1. 統計頻率
Map<Integer, Integer> freqMap = new HashMap<>();
for (int n : nums) freqMap.merge(n, 1, Integer::sum);
// 2. 轉 Entry 列表排序
List<Map.Entry<Integer, Integer>> entries =
new ArrayList<>(freqMap.entrySet());
entries.sort((e1, e2) -> {
int freqCmp = e1.getValue() - e2.getValue(); // 頻率升序
return freqCmp != 0 ? freqCmp : e1.getKey() - e2.getKey(); // 值升序
});
// 3. 提取鍵
int[] result = new int[entries.size()];
for (int i = 0; i < result.length; i++)
result[i] = entries.get(i).getKey();
return result;
}
}
Map.merge 簡化計數List.sort + Lambda 替代 Collections.sort + 匿名類TreeMap 但需自定義比較器,當前方案更直觀數字字符串(1-9),找最長嚴格遞增子串(相鄰字符差值為 1),長度相同取較大值。
public class SinaTest3 {
public String findMaxIncreasing(String str) {
if (str == null || str.isEmpty()) return "";
String max = "";
int start = 0; // 當前遞增段起始索引
for (int i = 1; i < str.length(); i++) {
// 判斷是否連續遞增:當前字符 - 前一字符 == 1
if (str.charAt(i) - str.charAt(i - 1) == 1) {
// 繼續遞增,檢查是否更新最大值
int len = i - start + 1;
if (len > max.length() ||
(len == max.length() && str.charAt(start) > max.charAt(0))) {
max = str.substring(start, i + 1);
}
} else {
// 遞增中斷,重置起始點
start = i;
}
}
return max;
}
}
"28953456323" → "3456" (長度4)
"12321" → "123" (長度3)
"987654" → "9" (無遞增,單字符)
"12345432123456" → "123456" (長度6)
"" → ""
"5" → "5"
| 題目 | 核心考點 | 進階延伸 |
|---|---|---|
| 二分查找 | 邊界條件、溢出防護、遞歸vs迭代 | 查找左/右邊界、旋轉數組搜索 |
| 頻率排序 | HashMap統計、Comparator鏈式比較 | Top K頻率、桶排序優化O(n) |
| 最長遞增 | 單次遍歷、滑動窗口、字符編碼技巧 | 最長遞增子序列(LIS) O(n log n) |