day10(数据结构)查找方法

查找方法

1. 顺序查找

####练习####

    (1)main函数中定义一个数组int a[10] = {12,34,45,23,54,2,4,65,23}

    (2)定义一个函数,查找指定数据

    (3)如果找到了,返回它的位置,数组下标即可,未找到返回-1

    (4)main函数中测试

       //p 保存数组首地址,n元素个数,value 要查找的值

        findByOrder(int *p, int n,int value)

#include <stdio.h>

int findByOrder(int *p,int n,int value)

{

    int i;

    for(i = 0; i < n; i++)

    {

        if(p[i] == value)

        {

            return i; //返回数组下标

        }

    }

    return -1; //如果程序能执行到这肯定没找到

}

int main()

{

    int a[10] = {12,34,54,23,12,3453,564,23,121,9};

    int num;

    int ret;

    puts("Please input num:");

    scanf("%d",&num);

    ret = findByOrder(a,10,num);

    if(ret == -1)

    {

        printf("Not find %d\n",num);

    }

    else

    {

        printf("find %d\n",a[ret]);

    }

    return 0;

}

顺序查找:当数据较多时int a[1000],查找慢。时间复杂度为O(n)。

   

//

2. 二分法查找(又叫分半查找、拆半查找)

    ### 前提条件:数组中元素必须为有序序列

   

思想: 每次进行分半,判断在middle的左边还是右边。

#include <stdio.h>

//二分查找 value代表的是被查找的值

int findByHalf(int *p, int n, int value)

{

    int low = 0;//low低

    int high = n-1;//high高

    int middle;//用来保存中间位置的下标

    while(low <= high)//注意此处循环结束的条件,需要加上 =

    {

        //不断获取中间位置的下标

        middle = (low + high) / 2;

        if(value < p[middle])//说明在前半段,移动high

        {

            high = middle-1;

        }

        else if(value > p[middle])//说明在后半段,移动low

        {

            low = middle + 1;

        }

        else//对应p[middle] == value 情况

        {

            return middle;

        }

    }

    return -1;//代表没有找到

}

int main(int argc, const char *argv[])

{

    int a[] = {12,34,56,77,89,342,567,7898};

    int i;

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)//把数组中的每个元素都找一遍,进行测试程序

    {

        printf("%d post is %d\n",a[i],findByHalf(a,sizeof(a)/sizeof(a[0]),a[i]));

    }

    //查找10000返回 -1

    printf("%d post is %d\n",10000,findByHalf(a,sizeof(a)/sizeof(a[0]),10000));

    return 0;

}

//二分查找,递归版本

int BinarySearch2(int a[], int value, int low, int high)

{

int mid = low + (high - low) / 2;

if (low > high)

return -1;

if (a[mid] == value)

return mid;

if (a[mid] > value)

return BinarySearch2(a, value, low, mid - 1);

if (a[mid] < value)

return BinarySearch2(a, value, mid + 1, high);

}

int main(int argc, char const *argv[])

{

int a[7]={12,34,56,89,345,567,7898};

int i;

printf("%d post is: %d\n",a[3],BinarySearch2(a,a[3],0,6));

return 0;

}

注:二分查找算法的时间复杂度为O(logn),和前的顺序查找算法相比,二分查找算法的执行效率更高。

补充:斐波那契查找

  在介绍斐波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念——黄金分割。

  黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。例如摄影中的黄金分割线。

大家记不记得斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…….(从第三个数开始,后边每一个数都是前两个数的和)。然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术中。

  基本思想:也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。

斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;

 开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种

  1)相等,mid位置的元素即为所求

  2)>,low=mid+1,k-=2;

  说明:low=mid+1说明待查找的元素在[mid+1,high]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。

  3)<,high=mid-1,k-=1。

  说明:low=mid+1说明待查找的元素在[low,mid-1]范围内,k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1个,所以可以递归 的应用斐波那契查找。

///

3. 分块查找

   

    索引存储

    索引表  +  源数据表

   

    条件:

     块间有序,块内无序

       

    思路:   

    (1)先在索引表中确定在哪一块中

    (2)再遍历这一块进行查找

   

//

//索引表

typedef  struct

{

    int max; //块中最大值

    int post;//块的起始位置下标,post数组下标

}index_t; //索引

   

//源数据表, 块间有序,块内无序。

int a[19] = {18, 10, 9, 8, 16, 20, 38, 42, 19, 50, 84, 72, 56, 55, 76, 100, 90, 88, 108};

             0                 5                   10                  15

//索引表

index_t b[4] = {{18,0},{50,5},{84,10},{108,15}};

****************************************************************************************

#include <stdio.h>

//索引表

typedef  struct

{

    int max; //块中最大值

    int post;//块的起始位置下标,post数组下标

}index_t; //索引

   

//a原数据表 index_list 索引表 value 被查找的值

int findByBlock(int *a, index_t *index_list,int value)

{

    //start和end作为源数据表的下标取搜索

    int start;//保存起始下标

    int end;//终止下标的后一个位置

    //1.思想,先确定value在哪一块中,遍历索引表与每块中的最大值进行比较

    int i;

    for(i = 0; i < 4; i++)

    {

        if(value <= index_list[i].max)//说明value有可能在i块中

        {

            //确定当前i块中的起始下标和终止

            start = index_list[i].post;

            //假设value在最后一块中,i+1数组越界,所以end的赋值,需要进行条件判断

            if(i == 3)//说明在最后一个块

            {

                end = 19;

            }

            else

            {

                end = index_list[i+1].post;

            }

            break;//注意此处一定要有break

        }

    }

    //确定块的起点和终点后,对源数据表进行遍历

    for(i = start; i < end; i++)

    {

        if(a[i] == value)

            return i;

    }

    return -1;

}

   

int main(int argc, const char *argv[])

{

    int i;

    //源数据表

    int a[19] = {18, 10, 9, 8, 16, 20, 38, 42, 19, 50, 84, 72, 56, 55, 76, 100, 90, 88, 108};

    //           0              4  5                   10                  15

    //索引表,结构体数组

    index_t index_list[4] = {{18,0},{50,5},{84,10},{108,15}};

    for(i = 0; i < 19; i++)//把源数据表中的每一个数据查询一遍,测试程序

    {

        printf("%d post is %d\n",a[i],findByBlock(a,index_list,a[i]));

    }

    printf("%d post is %d\n",22,findByBlock(a,index_list,22));

   

    return 0;

}

4. 哈希表(hash 哈希函数)

    散列存储

    有一张表,保存了数据中关键字与对应存储位置的关系

    在选择key的时候,要选择数据中不重复的关键字作为key

    存时按照对应关系存

    取时按照对应关系取

   

   

4.1 直接地址法

####练习1####

    //保存数据 年龄 + 年龄对应的人口数     

    10  100

    20  300

    输入年龄和人口数,按照对应关系保存到哈希表中,

    输入要查询的年龄,打印输出该年龄的人口数

#include <stdio.h>

//哈希函数,代表了数据中的关键字与存储位置之间的关系

//调用哈希函数能够得到数据的存储位置

int hashFun(int key)

{

    int post = key-1;//key-1代表关系 post通过关系得到存储位置

    return post;

}

//存储数据到哈希表,存的时候按照对应的关系存

void saveAgeNum(int *hash_list,int key,int num)

{

    //1.通过key得到数据存储的位置,调用哈希函数

    int post = hashFun(key);

    //2.将数据存储到哈希表中

    hash_list[post] = num;

   

}

//从哈希表中取数据,取的时候按照对应的关系取

int getAgeNum(int *hash_list,int key)

{

    //1.通过key得到数据存储的位置,调用哈希函数

    int post = hashFun(key);

    //2.将数据取出

    return hash_list[post];

}

int main(int argc, const char *argv[])

{

    int i;

    int age,num;//年龄和对应年龄的人口数

    int hash_list[200] = { 0 };//哈希表,用来保存年龄和对应年龄的人口数,之所以长度为200,暂定人的寿命为200岁

    for(i = 0; i < 4; i++)

    {

        printf("请您输入年龄和年龄对应的人口数:\n");//输入四组数据保存到哈希表中

        scanf("%d %d",&age,&num);

        //将输入的数据保存到哈希表中

        saveAgeNum(hash_list,age,num);

    }

    //进行查找对应年龄的人口数

    for(i = 0; i < 6; i++)

    {

        printf("请您输入要查询的年龄:\n");

        scanf("%d",&age);

        printf("%d: %d人\n",age,getAgeNum(hash_list,age));

    }

   

    return 0;

}

4.2 数字分析法

//k1 k2 k3 k4 k5 k6

//2  3  1  5  8  6

//2  4  2  3  4  6

//2  3  3  7  9  6

//2  3  9  8  8  6

//2  4  5  7  8  6

//2  3  4  2  9  6

//通过数字分析,只有中间两位数重复的次数最少

#include <stdio.h>

//哈希函数

int hashFun(int key)

{

    int post = key % 10000 / 100;//中间两位数

    return post;

}

//将数据存储

void saveNum(int *hash_list,int key)

{

    int post = hashFun(key);

    hash_list[post] = key;

}

//将数据取出

int getNum(int *hash_list,int key)

{

    int post = hashFun(key);

    return hash_list[post];

}

int main(int argc, const char *argv[])

{

    //k1 k2 k3 k4 k5 k6

    //2  3  1  5  8  6

    //2  4  2  3  4  6

    //2  3  3  7  9  6

    //2  3  9  8  8  6

    //2  4  5  7  8  6

    //2  3  4  2  9  6

    int i;

    int a[] = {231586,242346,233796,239886,245786,234296};

    //创建哈希表

    int hash_list[100];//100因为只取中间两位所以post为两位数

    //将数据存入哈希表

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        saveNum(hash_list,a[i]);

    //查找数据

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        printf("post:%d --- %d\n",hashFun(a[i]),getNum(hash_list,a[i]));

    return 0;

}

/

4.3 平方取中法

    当取key中的某些值,不能是记录均匀分布时,根据数学原理,对key进行key的2次幂(取平方)

    取key平方中的某些位可能会比较理想    

    key    key的平方   H(key)   

    0100   00 100 00    100  

    0110   00 121 00    121

    1010   10 201 00    201

    1001   10 020 01    020

    0111   00 123 21    123

#include <stdio.h>

//  key    key的平方   H(key)

//  0100   00 100 00    100  

//  0110   00 121 00    121

//  1010   10 201 00    201

//  1001   10 020 01    020

//  0111   00 123 21    123

//对key平方后,发现中间的三位重复次数最少

//哈希函数

int hashFun(int key)

{

    int post = key*key % 100000 / 100;

    return post;

}

//存储数据

void saveNum(int *hash_list, int key)

{

    int post = hashFun(key);

    hash_list[post] = key;

}

//取数据

int getNum(int *hash_list,int key)

{

    int post = hashFun(key);

    return hash_list[post];

}

int main(int argc, const char *argv[])

{

    int i;

    int a[] = {100,110,1010,1001,111}; //key

    int hash_list[1000] = { 0 };//哈希表

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        saveNum(hash_list,a[i]);

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        printf("post:%3d --- %d\n",hashFun(a[i]),getNum(hash_list,a[i]));

    return 0;

}

/

4.4 叠加法

    图书馆馆的图书条形码

    保留3位

//打印100-999之间的水仙花数

153

1的立方 + 5的立方 + 3的立方 = 153

1  153 / 100

5  153 % 100 / 10

3  153 % 10

321432543

321  num / 1000000

432  num % 1000000 / 1000

543  num % 1000

求和

进行求和

  1296  % 1000;//将这个条形码叠加之后压缩成只有三位

int hashFun(int key)//key条形码

{

    int post =

}

int a[] = {321432543,654657345,234456300,213342,123453333};

#include <stdio.h>

//哈希函数

int hashFun(int key)

{

    int post = (key / 1000000 + key % 1000000 / 1000 + key % 1000)%1000;

    return post;

}

//存储数据

void saveNum(int *hash_list,int key)

{

    int post = hashFun(key);

    hash_list[post] = key;

}

//获取数据

int getNum(int *hash_list,int key)

{

    int post = hashFun(key);

    return hash_list[post];

}

int main(int argc, const char *argv[])

{  

    int a[] = {321432543,654657345,234456300,213342,123453333};

    int hash_list[1000] = { 0 };//哈希函数的到的存储位置不可能大于1000

    int i;

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        saveNum(hash_list,a[i]);

    for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)

        printf("post:%4d --- %d\n",hashFun(a[i]),getNum(hash_list,a[i]));

    return 0;

}

/

叠加法举例

/

#include <stdio.h>

typedef struct

{

    int number;//图书条形码

    char name[30];//图书的名字

}book_info_t;

//1.哈希函数,得到存储位置

int hashFun(int key)

{

    int post = (key / 1000000 + key % 1000000 / 1000 + key % 1000) % 1000;

    return post;

}

//2.将数据存储到哈希表中

void saveBookInfo(book_info_t *hash_list,book_info_t book)

{

    //1.获取存储数据的位置

    int post = hashFun(book.number);//因为条形码相当于关键字key

    //2.将数据存储到哈希表中

    hash_list[post] = book;

}

//3.将数据从哈希表中取出

book_info_t getBookInfo(book_info_t *hash_list,int key)

{

    //1.先获取存储数据的位置

    int post = hashFun(key);

    //2.将数据取出

    return hash_list[post];

}

int main(int argc, const char *argv[])

{

    int i;

    int num;//用来保存输入的条形码

    book_info_t hash_list[1000] = { 0 };//因为叠加法后存储位置三位数

    book_info_t temp;

    //1.循环输入四组图书信息

    for(i = 0; i < 4; i++)

    {

        printf("请您输入图书条形码和图书的名字:\n");

        scanf("%d %s",&temp.number,temp.name);

        //将数据存储到哈希表中

        saveBookInfo(hash_list,temp);

    }

    //2.取数据 ,查询图书信息

    for(i = 0; i < 6; i++)

    {

        printf("请您输入要查询的条形码:\n");

        scanf("%d",&num);

        temp = getBookInfo(hash_list,num);

        printf("%d---%s\n",temp.number,temp.name);

    }

    return 0;

}

4.5 保留余数法

   

    见下面代码演示    

    数据个数为n

    n = 11

   

    哈希表的长度 m = n/a //n存储数据的个数 a的为装填因子,0.7-0.8之间最为合理

    m = 11 / 0.75 == 15  0-15之间最大的指数为13

    //prime 质数 为 不大于表长的质数

    //保留余数法

    int hashFun(int key)

    {

        int post = key % prime; //key % 13

        return post;

    }

   

4.6 随机数法

是取关键字的一个随机函数值作为它的哈希地址,即:H(key)=random(key),此方法适用于关键字长度不等的情况。

    int hashFun(int key)

    {

        int post = random(key);

        return post;

    }

注意:这里的随机函数其实是伪随机函数,随机函数是即使每次给定的 key 相同,但是 H(key)都是不同;而伪随机函数正好相反,每个 key 都对应的是固定的 H(key)。

/

4.7 解决哈希存储时产生的冲突

当两个不同的输入,输出值相同,我们就称之为哈希冲突

当冲突发生时,通过查找数组的一个空位,将数据填入,而不再用哈希函数得到数组下标

常用解决冲突的方法有开放地址法、链地址法和再哈希发。

1)开放地址法: 当得出的哈希地址产生冲突时,选取以下 3 种方法中的一种获取 d 的值,然后继续计算,直到计算出的哈希地址不在冲突为止,这 3 种方法为:

线性探测法:d=1,2,3,…,m-1

二次探测法:d=12,-12,22,-22,32,…

伪随机数探测法:d=伪随机数

注释:在线性探测法中,当遇到冲突时,从发生冲突位置起,每次 +1,向右探测,直到有空闲的位置为止;二次探测法中,从发生冲突的位置起,按照 +12-12+22,…如此探测,直到有空闲的位置;伪随机探测,每次加上一个随机数,直到探测到空闲位置结束。

2)再哈希法

当通过哈希函数求得的哈希地址同其他关键字产生冲突时,使用另一个哈希函数计算,直到冲突不再发生。

3)链地址法

将所有产生冲突的关键字所对应的数据全部存储在同一个线性链表中。例如有一组关键字为{19,14,23,01,68,20,84,27,55,11,10,79},其哈希函数为:H(key)=key MOD 13,使用链地址法所构建的哈希表如图所示:

4)建立一个公共溢出区

建立两张表,一张为基本表,另一张为溢出表。基本表存储没有发生冲突的数据,当关键字由哈希函数生成的哈希地址产生冲突时,就将数据填入溢出表。

4.7.1 线性探查法

#include <stdio.h>

//哈希函数

int hashFun(int key)

{

    int post = key % 13;//取余13的原因是因为 选不大于哈希表长的最大质数

    return post;

}

//哈希查找

int hashSearch(int *hash_list,int key)

{

    int d = 1;//d 取值 1 2 3 4 5 当冲突发生的时候采用一次线性探查法

    int post;//用来保存存储位置

    int remnum;//用来保存余数

    post = remnum = hashFun(key);

    while(d < 15 && hash_list[post] != 0 && hash_list[post] != key) //如果满足循环条件则代表,还是没有空位置

    {

        //采用一次线性探查法

        post = (remnum + d) % 15;

        d++;

    }

    if(d >= 15)

        return -1;//代表表已经溢出

    return post;

    //hash_list[post] == 0//意味着当前post这个位置可以存放数据,初始化哈希表所有位置全为0,代表没有存放数据

    //hash_list[post] == key //意味着当前表中的key已经存在

}

//向哈希表中存储数据

void hashSave(int *hash_list, int key)

{

    //先通过key获取存储位置,对key存储位置进行判断

    int post = hashSearch(hash_list,key);

    if(post == -1 || hash_list[post] == key)

    {

        printf("表溢出或key已经存在!!!\n");

        return;

    }

    //将数据存储到哈希表中

    hash_list[post] = key;

}

int main(int argc, const char *argv[])

{

    int i;

    int a[11] = {23,34,14,38,46,16,68,15,7,31,26};

    int hash_list[15] = { 0 };//哈希表长度为15 因为 数据长度n / 装填因子a  11 / 0.75,装填因子通常采用0.7-0.8之间最为合理

    //将数据全部保存到哈希表中

    for(i = 0; i < 11; i++)

    {

        hashSave(hash_list,a[i]);

    }

    //打印哈希表

    for(i = 0; i < 15; i++)

    {

        printf("%d ",hash_list[i]);

    }

    printf("\n");

    return 0;

}

///

4.7.2 链地址法

#include <stdio.h>

#include <stdlib.h>

typedef struct node_t  

{

    int key;

    struct node_t *next;

}link_node_t,*link_list_t;

//哈希函数

int hashFun(int key)

{

    int post = key % 13;

    return post;

}

link_list_t hashSearch(link_list_t *hash_list,int key)

{

    link_list_t h = NULL;//用来保存无头链表的头指针

    //1.先通过key调用哈希函数获取位置

    int post = hashFun(key);//需要将判断key放入第条链表

    h = hash_list[post];//h指向key对应存储位置的那条链表

    while(h != NULL && h->key != key)//相当于遍历无头链表,同时检查key

    {

        h = h->next;

    }

    return h;

    //h == NULL 说明没找到key可以进行存储

    //h != NULL h->key == key 说明key已经存在

}

//存储数据

void hashSave(link_list_t *hash_list,int key)

{

    int post = hashFun(key);

    link_list_t pnew = NULL;//用来保存新创建的节点

    link_list_t p = hashSearch(hash_list,key);

    if(p == NULL)//key不存在,可以进行插入数据

    {

        //1.创建一个新的节点用来保存key

        pnew = (link_list_t)malloc(sizeof(link_node_t));

        if(NULL == pnew)

        {

            perror("pnew malloc failed");

            return;

        }

        //2.将key保存到新节点中

        pnew->key = key;

        pnew->next = NULL;

        //3.将新的节点插入到对应存储位置的链表中,将新节点每次插入无头链表头的位置

        pnew->next = hash_list[post];

        hash_list[post] = pnew;

    }

    else

    {

        printf("key已经存在了!!!\n");

    }

}

int main(int argc, const char *argv[])

{

    int i;

    link_list_t h = NULL;//临时保存每条链表的头

    int a[11] = {23,34,14,38,46,16,68,15,7,31,26};  

    //hash_list是一个结构体指针数组,每一个元素都是结构体指针

    link_list_t hash_list[13] = { 0 };//为什么长度是13,因为保留余数法每次%13 得到的位置在0-12之间

    //将所有的key保存起来

    for(i = 0; i < 11; i++)

    {

        hashSave(hash_list,a[i]);

    }

    //遍历哈希表 有13条链表

    for(i = 0; i < 13; i++)//hash_list中保存的是13条无头链表的头指针

    {

        printf("%d:",i);

        h = hash_list[i];

        while(h != NULL)//相当于遍历无头链表

        {

            printf("%d ",h->key);

            h = h->next;

        }

        printf("\n");

    }

    return 0;

}


 

#####练习#####

    char a[] = "asdfasdlifadshjklrgeopaewrfpawedfoplhafgd"

   统计找到字符串中出现次数最多的字符并统计其出现次数,打印输出

#include <stdio.h>

int hashFun(char key)

{

    int post = key-'a';//下标为0的位置存的字符'a'的个数  1位置 'b'的个数  

    return post;

}

int main(int argc, const char *argv[])

{

    int max = -1;

    int i = 0;

    int post;//保存存储位置

    char a[] = "aaaabbbbacdddddeeemmmlzoe";

    int hash_list[26] = { 0 };//长度为26,因为总共就26个字母

    while(a[i] != '\0')

    {

        post = hashFun(a[i]);

        hash_list[post]++;

        i++;

    }

    //经过上面的遍历后,已经统计出结果

    for(i = 0; i < 26; i++)//max保存出现字母最多的次数

        max = max < hash_list[i] ? hash_list[i] : max;

    for(i = 0; i < 26; i++)

    {

        if(hash_list[i] == max)//只要与最多次数相同,那么就是最多的字母

        {

            printf("%c出现的次数是%d\n",i+'a',hash_list[i]);

        }

    }

    return 0;

}

   

   

5.二叉树查找

二叉排序树(Binary Sort Tree,简称 BST )又叫二叉查找树和二叉搜索树,是一种实现动态查找表的树形存储结构。方法类似二叉树的遍历,也可以用递归实现。

bitree_list_t SearchBST(bitree_list_t r, datatype key)

{

//如果 r 为空,则查找失败,返回NULL

if (r == NULL)

return NULL;

//如果查找成功,返回指向存有目标元素结点的指针

if (key == r->data)

return r;

else if (key < r->data)

return SearchBST(r->lchild, key); //继续去左子树中查找目标元素

else

return SearchBST(r->rchild, key); //继续去右子树中查找目标元素

}

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值