求数组中最小的k个数

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

package test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;

import org.junit.Test;

public class GetLeastNumbers_Solution {
    /**
     * 基于优先队列,时间复杂度为o(nlogk)
     * 
     * @param input
     * @param k
     * @return
     */
    public ArrayList<Integer> GetLeastNumbers_SolutionPriorityQuene(
            int[] input, int k) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if (input == null || input.length == 0 || k <= 0 || k > input.length)
            return result;
        PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(
                new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return o2.compareTo(o1);
                    }
                });
        for (int i = 0; i < k; i++) {
            maxHeap.offer(input[i]);
        }
        for (int j = k; j < input.length; j++) {
            if (input[j] < maxHeap.peek()) {
                maxHeap.poll();
                maxHeap.offer(input[j]);
            }
        }
        for (Integer integer : maxHeap) {
            result.add(integer);
        }

        return result;
    }

    /**
     * 基于堆排序,时间复杂度为o(nlogk)
     * 
     * @param input
     * @param k
     * @return
     */
    public ArrayList<Integer> GetLeastNumbers_SolutionMaxHeap(int[] input, int k) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if (input == null || input.length == 0 || k <= 0 || k > input.length)
            return result;
        //构建最大堆
        builtMaxHeap(input,k-1);
        for (int i = k; i < input.length; i++) {
            //数组k位后的数字比堆顶小
            if (input[k] < input[0]) {
                input[0] = input[k];
                //调整堆
                builtMaxHeap(input, k - 1);
            }
        }
        for (int i = 0; i < k; i++) {
            result.add(input[i]);
        }
        return result;
    }

    /**
     * 构建、调整最大堆
     * @param a
     * @param lastIndex
     */
    public void builtMaxHeap(int[]a,int lastIndex){
        int parentIndex = ((lastIndex-1) >> 1);
        //从最后一个节点的父节点开始
        for(int i=parentIndex;i>=0;i--){
            //存在子节点
            while (i*2+1<=lastIndex){
                int leftIndex = i*2+1;
                int rightIndex = i*2+2;
                int biggerIndex = leftIndex;
                //存在右结点
                if (rightIndex <= lastIndex){
                    if(a[rightIndex] > a[biggerIndex]){
                        biggerIndex = rightIndex;
                    }
                }
                //子节点中最大节点大于父节点
                if (a[biggerIndex] > a[i]){
                    swap(a,i,biggerIndex);
                    i = biggerIndex;
                }else{
                    break;
                }
            }
        }
    }
        
    
    
    /**
     * 基于Partition函数,时间复杂度为o(n),原数组已被修改
     * 
     * @param input
     * @param k
     * @return
     */
    public ArrayList<Integer> GetLeastNumbers_SolutionPartition(int[] input,
            int k) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if (input == null || input.length == 0 || k <= 0 || k > input.length)
            return result;

        int left = 0;
        int right = input.length - 1;
        int index = partition(input, 0, right);

        while (index != k - 1) {
            if (index > k - 1) {
                right = index - 1;
                index = partition(input, left, right);
            } else {
                left = index + 1;
                index = partition(input, left, right);
            }
        }
        for (int i = 0; i < k; i++) {
            result.add(input[i]);
        }

        return result;
    }
    
    
    /**
     * partition函数
     * @param a
     * @param left
     * @param right
     * @return
     */
    public int partition(int[] a, int left, int right) {
        while (left < right) {
            while (left < right && a[left] <= a[right]) {
                right--;
            }
            if (left < right) {
                swap(a, left, right);
            }
            while (left < right && a[left] <= a[right]) {
                left++;
            }
            if (left < right) {
                swap(a, left, right);
            }

        }
        return left;
    }

    public void swap(int[] a, int i, int j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }

    @Test
    public void testGetLeastNumbers_Solution() {
        int[] a = { 4, 5, 1, 6, 2, 7, 3, 8 };
        int k = 4;
        ArrayList<Integer> list = GetLeastNumbers_SolutionPartition(a, k);
        System.out.println(list.toString());

        ArrayList<Integer> list2 = GetLeastNumbers_SolutionPriorityQuene(a, k);
        System.out.println(list2.toString());
        
        ArrayList<Integer> list3 = GetLeastNumbers_SolutionMaxHeap(a, k);
        System.out.println(list3.toString());
        
    }
}

 除了基于优先队列,时间复杂度为O(nlogk)、堆排序,时间复杂度为O(nlogk)、partition函数,时间复杂度为O(n)的解法之外,还有基于冒泡排序的解法时间复杂度为(nk)

转载于:https://www.cnblogs.com/tongkey/p/7811186.html

<think>好的,用户想用C语言从数组中移除最小的几个元素。我需要先理解他的需。首先,他可能有一个数组,里面有很多元素,需要找出其中最小的几个,然后删除它们。这里的“最小的几个”可能是指确定的数量,比如最小的3个,或者所有最小的元素,比如如果有多个相同的最小值,都要删除。需要先明确这一点。 接下来,我得考虑如何实现。首先,如何确定要删除的元素。可能需要先对数组进行排序,找到最小的k个元素,或者找出所有等于最小值的元素。但如果是多个不同的最小元素,比如第二小、第三小等,可能需要更复杂的处理。但根据用户的描述,可能是指删除最小的多个元素,比如前k个最小的元素,或者所有出现的最小元素。需要明确用户的需。 根据提供的引用,用户可能参考了一些删除数组元素的方法,比如引用[1]和[2]中的例子,它们是通过移动数组元素来实现删除。所以,我需要考虑如何在C语言中操作数组,删除多个元素。 首先,可能需要找到数组中的最小元素,然后找到所有出现的最小元素的位置,或者如果用户想删除k个最小的元素,不管重复否,比如删除最小的三个元素,即使有重复也要删除三个。这里可能需要先确定用户的具体需。 假设用户希望删除所有最小的元素,或者删除指定数量的最小元素。例如,用户可能有一个数组,想删除最小的n个元素,其中n是用户指定的数值。或者,用户可能想删除所有等于最小值的元素,不管有多少个。需要明确这一点。 根据问题描述,用户的问题是用C语言剔除数组最小的多个元素,所以可能需要动态确定要删除的元素的数量。比如,找出所有最小的元素(可能有多个相同的最小值)并删除,或者删除前k个最小的元素(可能包括重复值)。 接下来,我需要考虑如何实现这个功能。首先,找出数组中的最小值。这可以通过遍历数组,找到最小的元素。然后,统计有多少个这样的元素。或者,如果用户想删除k个最小的元素,不管是否是同一个值,比如最小的三个不同的元素,这可能更复杂。但通常来说,可能用户是指删除所有出现的最小元素,或者删除k个最小的元素,包括重复的情况。 假设用户想删除数组最小的k个元素。例如,数组中有多个元素,其中可能有重复的最小值,或者不同的值,需要删除k个最小的元素,无论是否重复。例如,数组是[5, 2, 3, 2, 1, 4],删除最小的2个元素,即1和2中的一个。这时候需要明确如何处理。或者,可能用户想删除所有出现的最小元素,例如,如果数组中有三个1,那么删除这三个1。 但根据问题描述,用户提到“最小的多个元素”,可能是指所有最小元素,或者多个最小元素。需要进一步分析。 根据引用中的例子,比如引用[4]中的代码是消除连续重复三个及以上的元素,这可能和用户的问题不同,但可以参考如何处理数组元素的删除。 现在,我需要设计一个算法,步骤如下: 1. 确定要删除的最小元素的数量或条件。例如,用户可能想删除所有最小的元素,或者删除k个最小的元素。 2. 找到这些需要删除的元素的位置。 3. 将这些元素从数组中移除,可能需要移动后面的元素向前覆盖,并调整数组的长度。 可能的实现步骤: 方法一:删除所有最小元素 - 找到数组中的最小值。 - 遍历数组,将所有不等于最小值的元素保留,组成新数组。 方法二:删除k个最小元素(可能包括重复) - 找出数组中的k个最小元素,可能需要排序原数组的副本,然后取前k个元素,再在原数组中删除这些元素(注意重复的情况)。 例如,原数组为[3,1,2,1,4],k=2,那么最小的两个元素是1和1,或者1和2?这取决于如何定义“k个最小的元素”。如果按数值大小,最小的两个不同的值,或者按出现次数。通常,可能用户想删除前k个最小的元素,无论是否重复。例如,对于数组[5,2,3,2,1,4],k=3,即删除最小的三个元素,即1、2、2。这时候需要先找到所有元素中的最小值,然后依次处理。 或者,可能需要先对数组进行排序,找出前k个最小的元素,然后在原数组中删除这些元素,但需要处理重复的情况。这可能比较复杂。 现在,我需要考虑用户的具体需。根据问题描述,用户可能希望删除所有最小的元素,或者删除多个最小元素。例如,如果数组中有多个最小值,全部删除。或者,用户可能想删除多个最小的元素,例如前三个最小的元素,不管它们的值是否相同。 根据用户的问题,“剔除数组最小的多个元素”,可能是指删除多个最小的元素,例如,用户输入一个数组,然后输入一个数字k,删除k个最小的元素。或者,可能是指删除所有最小的元素,无论有多少个。例如,数组中有三个1,都删除。 需要看用户的具体需。可能需要两种情况都考虑。 现在,我需要参考用户提供的引用内容。引用[1]提到如何删除数组中的某个值,通过遍历数组,将不需要删除的元素移动到前面。引用[2]中的例子是删除字符数组中的重复元素,通过移动元素覆盖,并减少数组长度。引用[4]中的代码是消除连续重复三个及以上的元素,采用标记法,将需要删除的位置标记,然后处理。 综合这些,可能的步骤是: 1. 找出所有需要删除的元素(比如最小的元素或者多个最小的元素) 2. 遍历原数组,将不需要删除的元素保留到新数组中,或者原地调整数组。 在C语言中,数组的大小是固定的,所以通常的做法是创建一个新的数组,或者修改原数组的内容,并记录有效长度。 例如,对于方法一:删除所有最小值元素。 步骤: a. 找出数组中的最小值。 b. 遍历数组,统计有多少个最小值元素,确定新数组的长度。 c. 创建新数组,或者原地调整,将非最小值的元素移动到前面。 或者,原地调整,用两个指针,一个指向当前写入位置,另一个遍历原数组,将非最小值的元素依次放入,最后记录新长度。 例如,代码可能如下: int remove_min_elements(int arr[], int n) { if (n == 0) return 0; int min_val = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < min_val) { min_val = arr[i]; } } int new_len = 0; for (int i = 0; i < n; i++) { if (arr[i] != min_val) { arr[new_len++] = arr[i]; } } return new_len; } 这个方法会删除所有等于最小值的元素。例如,数组[1,2,3,1,4],处理后变为[2,3,4],长度3。 但如果用户想删除k个最小的元素,比如不管是否为最小值,只是删除前k个最小的元素,那需要另一种方法。 例如,假设数组是[3,1,2,5,0,0],k=3,要删除三个最小的元素。最小的三个元素是0,0,1。这时需要找到这三个元素的位置,然后删除它们。但如何处理重复的位置? 可能的方法是: 1. 复制原数组并进行排序,找到第k小的元素的值。 2. 在原数组中删除前k个出现的元素,这些元素小于等于第k小的值。 或者,另一种方法是: - 找到所有元素中的k个最小元素,可能多次遍历,找到每个最小的元素,直到收集k个元素,然后删除它们在原数组中的出现。 但这种方法可能比较复杂。 例如,假设k=3,数组是[5, 1, 3, 1, 2, 4],最小的三个元素是1,1,2。那么需要删除这三个元素。但是如何确定哪些元素被选中? 一种方法是先找到所有元素,然后排序,取前k个,然后在原数组中删除这些元素,按顺序删除前k个最小的元素。 例如,原数组排序后的副本是[1,1,2,3,4,5],前k=3个元素是1,1,2。然后在原数组中删除这三个元素,不管它们的顺序。但这样可能有问题,因为原数组中可能有多个符合条件的元素。 另一种方法是,遍历原数组,每次找到当前最小的元素,删除它,直到删除了k个元素。这种方法可能更直接,但效率较低,特别是当k较大时。 例如,每次找到数组中的最小值,删除其中一个,重复k次。这会导致多次遍历数组,时间复杂度为O(kn),当k接近n时,时间复杂度为O(n^2),对于大数组可能不够高效。 但用户的问题可能不涉及特别大的数据量,所以这种方法可能可行。 但如何实现呢?例如,对于数组arr,长度为n,需要删除k个最小的元素。每次找到最小值的位置,删除它,然后数组长度减一,重复k次。 但需要注意数组元素的移动。 例如,代码可能如下: int delete_k_smallest(int arr[], int n, int k) { for (int count = 0; count < k; count++) { if (n == 0) break; // 防止数组为空 int min_index = 0; for (int i = 1; i < n; i++) { if (arr[i] < arr[min_index]) { min_index = i; } } // 删除arr[min_index],将后面的元素前移 for (int i = min_index; i < n - 1; i++) { arr[i] = arr[i + 1]; } n--; } return n; } 这种方法会删除k个元素,每次删除当前数组中的最小元素。例如,原数组是[3,1,2,1,4],k=3,第一次删除1(索引1),数组变为[3,2,1,4],n=4;第二次删除1(索引2),数组变为[3,2,4],n=3;第三次删除2(索引1),数组变为[3,4],n=2。最终返回n=2。 但这样处理后的数组可能并不是用户想要的,因为如果原数组中有多个相同的最小值,比如k=3,数组是[1,1,1,2,3],三次删除后,数组变为[2,3],n=2。 这取决于用户的需,是否希望删除k个最小的元素,不管它们的值是否相同。如果用户希望删除前k个最小的元素(按出现顺序),这种方法可能适用。 但用户的问题可能更倾向于删除所有最小的元素,或者删除多个不同的最小元素。因此,需要明确用户的需。 根据用户的问题描述,“剔除数组最小的多个元素”,可能是指删除所有最小的元素,或者根据某个条件删除多个最小的元素。但用户没有明确说明是删除所有最小元素,还是删除前k个最小的元素。 因此,可能需要提供两种方法,或者询问用户具体需。但在回答中,应假设用户的需,并给出对应的解决方案。 根据用户提供的引用,例如引用[1]中提到的“删除数组中的某个值”,即删除所有等于该值的元素。引用[4]中的例子是删除连续重复三个及以上的元素。这可能暗示用户可能更倾向于删除所有满足条件的元素,而不仅仅是前k个。 因此,可能用户的需是删除所有最小的元素,无论有多少个。例如,数组中有三个1,则全部删除。 因此,解决方案可以是:找到最小值,删除所有等于该值的元素。 但用户的问题中提到“最小的多个元素”,可能指多个不同的最小元素,例如,如果有多个不同的最小值,比如数组中有1和2,但用户可能想删除最小的两个不同的值。这可能需要不同的处理方法。 不过,通常来说,“最小的多个元素”更可能指的是多个实例的最小值,即所有出现的最小元素。因此,正确的做法是删除所有最小值元素。 例如,数组[1,3,2,1,4],处理后变成[3,2,4]。 那么,针对这种情况,代码实现如下: 首先遍历数组找到最小值,然后再次遍历数组,将所有不等于最小值的元素保留,并记录新的长度。 这种方法的时间复杂度是O(n),空间复杂度为O(1)(如果原地修改数组的话)。 例如: int remove_all_min_elements(int arr[], int n) { if (n == 0) return 0; int min_val = arr[0]; for (int i = 1; i < n; ++i) { if (arr[i] < min_val) { min_val = arr[i]; } } int new_len = 0; for (int i = 0; i < n; ++i) { if (arr[i] != min_val) { arr[new_len++] = arr[i]; } } return new_len; } 这样处理后,数组的前new_len个元素就是删除所有最小值后的结果。 如果用户的需是删除多个不同的最小元素,比如删除前k个最小的元素(可能包含不同的值),则需要不同的方法。例如,找到前k个最小的元素,不管值是否相同,然后删除它们。这可能需要对数组进行排序,找到第k小的元素,然后删除所有小于等于该元素的值,或者仅删除前k个。 但这种情况比较复杂,可能需要更详细的步骤。 例如,假设k=3,数组是[5, 2, 3, 2, 1, 4]。先找到前三个最小的元素:1、2、2。然后删除这三个元素。在原数组中,这三个元素的位置可能不同,所以需要确定如何找到并删除它们。 这种情况下,可以: 1. 复制原数组,并对其进行排序,得到排序后的数组。 2. 确定第k小的元素的值。例如,排序后的数组是[1,2,2,3,4,5],取第k个元素,即索引k-1的位置的值。这里k=3,所以第三个元素是2。 3. 然后遍历原数组,删除前k个小于或等于该值的元素。但需要注意重复的情况。 这可能比较复杂,或者另一种方法是将原数组中的所有元素排序,记录前k个最小的元素的值,然后在原数组中删除这些元素中的前k个出现的位置。 这种方法需要跟踪哪些元素已经被删除,可能需要额外的空间来记录。 例如: int delete_k_smallest(int *arr, int n, int k) { if (k <= 0) return n; if (k >= n) return 0; // 创建一个副本数组,并排序 int *sorted = malloc(n * sizeof(int)); memcpy(sorted, arr, n * sizeof(int)); qsort(sorted, n, sizeof(int), compare_ints); // 找到第k小的元素的值 int threshold = sorted[k-1]; free(sorted); // 统计需要删除的元素数量 int count = 0; int new_len = 0; for (int i = 0; i < n; i++) { if (arr[i] < threshold || (arr[i] == threshold && count < k)) { count++; } else { arr[new_len++] = arr[i]; } } return new_len; } 但这种方法可能需要处理元素等于阈值的情况,并确保只删除k个元素。例如,当原数组中存在多个等于阈值的元素时,可能删除超过k个元素,所以需要精确控制。 这可能比较复杂,需要更仔细的处理。 综上,用户的问题可能需要分为两种情况来处理: 1. 删除所有最小的元素(所有等于最小值的元素)。 2. 删除前k个最小的元素(不管值是否重复)。 在回答中,需要明确用户的需,并给出对应的解决方案。根据用户提供的引用,可能更接近第一种情况,即删除所有最小元素,因为引用[1]和[2]中的例子都是删除特定值的元素。 因此,可能用户需要的是删除所有最小的元素,即所有等于最小值的元素。例如,数组中的最小值是x,删除所有x。 所以,我将按照这种情况给出解决方案。 接下来,需要考虑如何处理数组。在C语言中,数组的大小是固定的,所以通常的做法是修改原数组,将不需要删除的元素前移,并返回新的有效长度。 例如,代码示例如下: #include <stdio.h> int removeMinElements(int arr[], int n) { if (n == 0) return 0; // 找出最小值 int minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } // 过滤非最小值元素 int newLen = 0; for (int i = 0; i < n; i++) { if (arr[i] != minVal) { arr[newLen++] = arr[i]; } } return newLen; } int main() { int arr[] = {3, 1, 2, 1, 4, 1}; int n = sizeof(arr)/sizeof(arr[0]); printf("原数组: "); for (int i = 0; i < n; i++) printf("%d ", arr[i]); int newLen = removeMinElements(arr, n); printf("\n处理后: "); for (int i = 0; i < newLen; i++) printf("%d ", arr[i]); return 0; } 运行结果: 原数组: 3 1 2 1 4 1 处理后: 3 2 4 这样,所有等于最小值1的元素都被删除了。 如果用户的需是删除多个不同的最小元素,比如前k个最小的元素,那么需要不同的方法。例如,可以修改函数,接受一个参数k,然后删除前k个最小的元素,不管它们的值是否相同。例如: int deleteKSmallest(int arr[], int n, int k) { if (k <= 0) return n; if (k >= n) return 0; // 复制数组并排序,找到第k小的元素 int *sorted = (int *)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { sorted[i] = arr[i]; } qsort(sorted, n, sizeof(int), compare); int threshold = sorted[k-1]; free(sorted); int count = 0; int newLen = 0; for (int i = 0; i < n; i++) { if (arr[i] < threshold) { count++; } else if (arr[i] == threshold && count < k) { count++; } else { arr[newLen++] = arr[i]; } } return newLen; } 这里需要实现compare函数: int compare(const void *a, const void *b) { return (*(int*)a - *(int*)b); } 这种方法会删除前k个最小的元素,可能包括重复的值。例如,如果数组是[1,1,2,3],k=2,那么会删除前两个1,结果为[2,3]。 但这种方法需要动态分配内存来复制数组,并进行排序,可能对于大数组来说效率不高,但逻辑上正确。 用户可能根据具体需选择不同的方法。在回答中,应该说明这两种情况,并给出相应的解决方案。 根据用户的问题描述,可能需要先回答如何删除所有最小的元素,然后可能提到如何删除前k个最小的元素,以满足不同的需。 因此,在回答中,可以给出两种方法的说明,并分别提供代码示例。 另外,需要注意C语言中数组的处理,例如,如何移动元素,如何记录新的长度,以及如何处理内存分配等。 最后,用户提供的引用中提到数组越界的问题,如引用[3],所以在代码中需要确保不会访问超出数组长度的元素,特别是在移动元素时。 综上,回答应该包括以下步骤: 1. 确定要删除的最小元素的条件(所有最小元素或前k个)。 2. 遍历数组找到这些元素。 3. 使用双指针法在原数组中覆盖,或者创建新数组保存结果。 4. 返回新数组的有效长度。 并提供相应的代码示例和说明。</think>在C语言中剔除数组最小的多个元素,可以通过以下步骤实现: ### 方法一:删除所有最小值元素 此方法将删除数组中所有等于最小值的元素 ```c #include <stdio.h> int removeAllMinElements(int arr[], int n) { if (n == 0) return 0; // 查找最小值 int minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } // 过滤保留非最小值元素 int newLen = 0; for (int i = 0; i < n; i++) { if (arr[i] != minVal) { arr[newLen++] = arr[i]; } } return newLen; } int main() { int arr[] = {3,1,2,1,4,1}; int n = sizeof(arr)/sizeof(arr[0]); printf("原数组: "); for (int i=0; i<n; i++) printf("%d ", arr[i]); int newLen = removeAllMinElements(arr, n); printf("\n处理后: "); for (int i=0; i<newLen; i++) printf("%d ", arr[i]); return 0; } ``` ### 方法二:删除前k个最小元素 此方法将删除数组中前k个最小的元素(可包含重复值) ```c #include <stdio.h> #include <stdlib.h> int compare(const void *a, const void *b) { return (*(int*)a - *(int*)b); } int deleteKSmallest(int arr[], int n, int k) { if (k <= 0) return n; if (k >= n) return 0; // 创建排序副本确定阈值 int *sorted = (int*)malloc(n * sizeof(int)); for (int i=0; i<n; i++) sorted[i] = arr[i]; qsort(sorted, n, sizeof(int), compare); int threshold = sorted[k-1]; free(sorted); // 筛选保留元素 int count = 0; int newLen = 0; for (int i=0; i<n; i++) { if (arr[i] < threshold || (arr[i] == threshold && count < k)) { count++; } else { arr[newLen++] = arr[i]; } } return newLen; } int main() { int arr[] = {5,2,3,2,1,4}; int n = sizeof(arr)/sizeof(arr[0]); int k = 3; printf("原数组: "); for (int i=0; i<n; i++) printf("%d ", arr[i]); int newLen = deleteKSmallest(arr, n, k); printf("\n处理后: "); for (int i=0; i<newLen; i++) printf("%d ", arr[i]); return 0; } ``` ### 关键实现细节 1. **双指针法**:通过`newLen`指针标记有效位置,将保留元素前移覆盖删除元素[^2] 2. **复杂度控制**:方法一的时间复杂度为$O(n)$,方法二因排序操作复杂度为$O(n \log n)$ 3. **内存管理**:方法二需要临时数组进行排序操作,需注意及时释放内存[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值