(1)、输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
要求时间复杂度为O(n)。 如:数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2。
解题思路:若求和最大的子数组,假设sum[i]是包含第i个元素在内的子数组,Max是当前子数组的最大和。那么对于下一个元素A[i+1],可以有以下两种可能,
sum[i+1] = max(a[i+1], sum[i] + a[i+1])
result = max(result, sum[i])
代码如下:
#include <stdlib.h> #include <stdio.h> int main(char *argv[], int argc) { int i = 0 ; int j = 0; int A[10] = {1, -2, 3, 10, -4, 7, 2, -5}; int max = A[0]; int sum = 0; for(i=0; i<10; i++) { if(sum >= 0) sum += A[i]; else sum = A[i]; if(sum>max) max = sum; } printf("MAX Sum:%d",max); system("PAUSE"); return 0; }
(2)、输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
解题思路:栈可以将一个序列逆序输出,如果把单词当做一个元素,一次入栈,然后再依次出栈,得到的就是逆序结果。因为单词是以空格分隔的,我们在顺 序读取句子中的字母或者标点时,遇到空格就知道是某一个单词的结束了。把当前的单词入栈。出栈的时候,再把单词组装为句子就可以了。
代码如下,这个代码没有严格使用栈,最后的单词组装也没有完成,不过逆序的功能已经实现。
#include <stdlib.h> #include <stdio.h> struct link_node { char *str; struct link_node *next; }; void split_src(char *src); void rebuild_dst(char *dst); int main(char *argv[], int argc) { char *dst = NULL; char *src = "I AM A ASTUDENT."; split_src(src); //rebuild_dst(dst); // printf("%s ",dst); system("PAUSE"); return 0; } void split_src(char *src) { int i = 0; int str_len = strlen(src); char word[20] = {'