常用算法题

来源:互联网 发布:数据库关系模型设计 编辑:程序博客网 时间:2024/05/08 10:47

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,constchar * 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));









0 0
原创粉丝点击