21xrx.com
2025-04-12 20:27:41 Saturday
文章检索 我的文章 写文章
解决Java算法难题:从代码案例出发
2023-06-15 09:55:03 深夜i     14     0
Java算法 字符串压缩 数组去重 查找第K大的元素

Java是一门非常强大的编程语言,但Java算法问题可能会让许多开发人员感到困扰。在本文中,我们将探讨一些最常见的Java算法难题,并帮助您解决这些问题,提高程序的效率。

1. 压缩字符串

有时,对于性能要求比较高的应用程序,需要对大量数据进行压缩和解压缩处理。现在,我们将做一个字符串压缩的例子,即使在处理大量字符时也能快速高效地工作。

public static String compress(String s) {
  int count = 1;
  StringBuffer sb = new StringBuffer();
  for (int i = 1; i < s.length(); i++) {
    if (s.charAt(i) == s.charAt(i - 1)) {
      count++;
    } else {
      sb.append(s.charAt(i - 1)).append(count);
      count = 1;
    }
  }
  sb.append(s.charAt(s.length() - 1)).append(count);
  return sb.toString();
}

2. 数组去重

在Java中,使用Set集合可以很容易地去重。不过,我们也可以在处理大量数据时,使用更高效的算法,如下面的例子:

public static int[] removeDuplicates(int[] nums) {
  if (nums.length == 0)
    return nums;
  
  int prev = nums[0];
  int k = 1;
  for (int i = 1; i < nums.length; i++) {
    if (nums[i] != prev) {
      nums[k] = nums[i];
      prev = nums[i];
      k++;
    }
  }
  int[] result = new int[k];
  for (int i = 0; i < k; i++) {
    result[i] = nums[i];
  }
  return result;
}

3. 查找第K大的元素

查找数组中第K大的元素是一个常见的问题。接下来,我们将介绍一个常见的算法,该算法具有O(n)的时间复杂度:

public static int findKthLargest(int[] nums, int k) {
  int left = 0;
  int right = nums.length - 1;
  while (left <= right) {
    int pivotIndex = partition(nums, left, right);
    if (pivotIndex == nums.length - k) {
      return nums[pivotIndex];
    } else if (pivotIndex > nums.length - k)
      right = pivotIndex - 1;
     else {
      left = pivotIndex + 1;
    }
  }
  return -1;
}
private static int partition(int[] nums, int left, int right) {
  int pivot = nums[right];
  int i = left;
  for (int j = left; j < right; j++) {
    if (nums[j] <= pivot) {
      swap(nums, i, j);
      i++;
    }
  }
  swap(nums, i, right);
  return i;
}
private static void swap(int[] nums, int i, int j) {
  int temp = nums[i];
  nums[i] = nums[j];
  nums[j] = temp;
}

  
  

评论区