1.给定一个字符串 str,返回 str 的最长无重复字符子串的长度。举例,str="abcd",返回 4。str="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.给定两个字符串A和B,其中只有小写字符,已知A的字典序小于B,求在A和B的字典序之间,有多少个字符串。以长度较长的一方为准。
例如:A=“ab”,B=“ac”。他们的字典序挨着,所以返回0。
例如:A=“a”,B=“cc”。B的长度较长为2,所以A和B之间的字符串包括:
”aa”..”az”,”b”,”ba”..”bz”,”c”,”ca”,”cb”。一共56个
例如:A=“aa”,B=“c”。A的长度较长为2,所以所以A和B之间的字符串包括:
“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));