常用算法题

1.给定一个字符串 str,返回 str 的最长无重复字符子串的长度。举例,str="abcd",返回 4str="aabcb"

最长无重复字符子串为"abc",返回 3

#include <stdio.h>

#include <string.h>

#include <time.h>

#include <stdlib.h>

#define MAX(a,b)  ((a>b)?(a):(b))

#define MIN(a,b)  ((a<b)?(a):(b))


int  maxUnique(char str[]);

char *getRandomString(int len);

char *maxUniqueString(char * str);


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

    

    srand((unsigned)time(NULL ) );

    char *str = getRandomString(10);

    printf("str = %s\n",str);

    printf("len = %d\n",maxUnique(str));

    str = maxUniqueString(str);

    printf("str = %s\n",str);

    return 0;

}


char *getRandomString(int len)

{

    char *str = (char *)malloc(sizeof(char)*len);

    int base  = 'a';

    int range = 'z'-'a' +1;

    for (int i =0; i!= len; i ++) {

        str[i]= rand()%range + base;

    }

    

    return str;

}


char *maxUniqueString(char * str)

{

    if (str == NULL ||strlen(str) ==0 ) {

        return str;

    }

    int map[256];

    for (int i =0; i <256; i ++) {

        map[i]=-1;

    }

    int len = -1;

    int pre = -1;

    int cur = 0;

    int end = -1;

    

    for (int i =0 ; i !=strlen(str); i ++) {

        // printf("map[str[%d]]=%c\n",i,map[str[i]]);

        pre = MAX(pre, map[str[i]]);

        cur = i -pre;

        if (cur >len) {

            len = cur;

            end = i;

        }

        map[str[i]] = i;

        //printf("pre = %d,cur = %d,len = %d,end = %d,map[str[%d]]=%d\n",pre,cur,len,end,i,map[str[i]]);

    }

    char *desc = (char*)malloc(sizeof(char)*len);

    strncpy(desc, str+(end - len + 1), len);

    return desc;

}


int maxUnique(char str[])

{

    if (!str  || strlen(str)<2) {

        return 0;

    }

    int map[256];

    for (int i =0; i <256; i ++) {

        map[i]= -1;

    }

    

    int len = 0;

    int pre = -1;

    

    for (int i =0; i!= strlen(str); i++) {

        // printf("start --->pre= %d,i=%d,i-pre=%d,len =%d,map[str[%d]]= %d\n",pre,i,i-pre,len,i,map[str[i]]);

        pre = MAX(pre, map[str[i]]);

        len = MAX(len, i - pre);

        map[str[i]]= i;

        

        printf("end --->pre= %d,i=%d,i-pre=%d,len =%d,map[str[%d]]= %d\n\n",pre,i,i-pre,len,i,map[str[i]]);

    }

    

    return len;

}


2.给定一个数组arr,数组长度为len。求满足0<=a<=b<len的arr[b]-arr[a]最大值

int getMax1(int arr[])
{
    int count = 0;
    for (int i = 0; arr[i] >0; i++)count ++;
    if (arr== NULL || count<2) {
        return 0;
    }
    
    int res = 0;
    for (int i =0; i < count -1; i ++) {
        for (int j = i + 1; j <count; j ++) {
            res = MAX(res, arr[j]- arr[i]);
        }
    }
    return res;
}


int getMax2(int arr[])
{
    int count = 0;
    for (int i = 0; arr[i] >0; i++)count ++;
    if (arr == NULL ||count <2 ) {
        return 0;
    }
    int min = INT32_MAX;
    int res = 0;
    for (int i =0; i< count; i++) {
        min = MIN(min, arr[i]);
        res = MAX(res, arr[i]-min);
    }
    return res  ;
}

int *getRandomArray(int len)
{
    int *arr = (int *)malloc(sizeof(int)*len);
    for (int i = 0; i < len; i ++) {
        arr[i]= rand()%100+1;
    }
    return arr;
}

 3.给定两个字符串AB,其中只有小写字符,已知A的字典序小于B求在AB的字典序之间,有多少个字符串。以长度较长的一方为准。

     例如:A=“ab”B=“ac”。他们的字典序挨着,所以返回0

     例如:A=“a”B=“cc”B的长度较长为2,所以AB之间的字符串包括:

     ”aa”..”az”,”b”,”ba”..”bz”,”c”,”ca”,”cb”。一共56

     例如:A=“aa”,B=“c”A的长度较长为2,所以所以AB之间的字符串包括:

     “ab”..”az”“b”“ba”..”bz”。一共52个。

long gapNumber(char *str1,char *str2)
{
    long str1_len = strlen(str1);
    long str2_len = strlen(str2);
    if (str1_len ==0 || str2_len ==0||(strcmp(str1,str2)==0)) {
        return 0;
    }
    
    long len = MAX(str1_len, str2_len);
    
    return (pos(str2, len) - pos(str1, len))-1;
}

long  pos(char *s,long len)
{
    long res = 0;
    long pre = 0;
    for (long i = 0; i <strlen(s); i ++) {
        pre = pre * 26 +s[i] -'a';
        pre += pre + 1;
    }
    for (long i = strlen(s); i <len; i ++) {
        pre *= 26;
        res +=pre;
    }
    return res;
}

 4.给定一个二维数组代表一个三角形,比如:

     int[][] t = { { 2 }, { 3, 4 }, { 6, 5, 7 }, { 4, 1, 8, 3 }, };

     t代表如下三角形:

        2

       3 4

      6 5 7

     4 1 8 3

     找出从其顶部到底部的所有路径中,路径上的整数构成的最小和。

     从顶部向底部移动时,每次可以移动到下一行中左边或右边的相邻整数,比如如上的例子,

     最小整数和为11,即2+3+5+1=11

int minPath(int (*t)[4],int len)
{
    for (int i =len -2 ; i>=0; i--) {
        for (int j = 0; j<=i; j++) {
            printf("%d,%d\n",t[i+1][j], t[i+1][j+1]);
            t[i][j] += MIN(t[i+1][j], t[i+1][j+1]);
        }
    }
    return t[0][0];
}

    int t[][4] = {
                      { 2 },
                     { 3, 4 },
                    { 6, 5, 7 },
                   { 4, 1, 8, 3 }
                  };
    
    printf("count =%d\n",minPath(t,4));


5.求最长的包含相同数目的1的子数组长度,要求索引位置一样, A[i]A[j]包含的1的个数和B[i]B[j]包含的1的个数一样。

int  maxLength(int arr1[],int len1,int arr2[],int len2)
{
    if (len1 ==0 ||len2==0 || len1 != len2) {
        return 0;
    }
    
    for (int i = 0; i< len1; i ++) {
        arr1[i]+= (arr2[i] == 1?-1:0);
    }
    
    char *map = (char*)malloc(sizeof(char)*len1);
    
    map[0]  = -1;
    int len = 0;
    int sum = 0;
    for (int i = 0; i <len1; i ++) {
        sum += arr1[i];
        printf("map[%d]=%d\n",i,map[i]);
        if (map[sum]) {
            len = MAX(i - map[sum], len);
        }
        if (!map[sum]) {
            map[sum]= i;
        }
    }
    free(map);
    return len;
}
    
int arr1[5] = {1,0,0,1,0};
int arr2[5] = {0,0,0,0,1};
printf("len = %d \n",maxLength(arr1, 5, arr2, 5));









Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值