原题:
Implement a MapSum class with insert
, and sum
methods.
For the method insert
, you'll be given a pair of (string, integer). The string represents the key and the integer represents the value. If the key already existed, then the original key-value pair will be overridden to the new one.
For the method sum
, you'll be given a string representing the prefix, and you need to return the sum of all the pairs' value whose key starts with the prefix.
Example 1:
Input: insert("apple", 3), Output: Null Input: sum("ap"), Output: 3 Input: insert("app", 2), Output: Null Input: sum("ap"), Output: 5
代码如下:
typedef struct {
char* string;
int value;
struct MapSum* next;
} MapSum;
/** Initialize your data structure here. */
MapSum* mapSumCreate() {
MapSum* head;
head=(MapSum*)malloc(sizeof(MapSum));
head->next=NULL;
return head;
}
void mapSumInsert(MapSum* obj, char* key, int val) {
MapSum* p;
p=obj->next;
while(p!=NULL)
{
if(strlen(p->string)==strlen(key)&&strstr(key,p->string)!=NULL)
{
p->value=val;
return;
}
p=p->next;
}
p=(MapSum*)malloc(sizeof(MapSum));
p->string=(char*)malloc(sizeof(char)*(strlen(key)+1));
strcpy(p->string,key);
p->value=val;
p->next=obj->next;
obj->next=p;
}
int mapSumSum(MapSum* obj, char* prefix) {
int sum=0;
MapSum* p;
p=obj->next;
while(p!=NULL)
{
if(strstr(p->string,prefix)==p->string)
{
sum+=p->value;
}
p=p->next;
}
return sum;
}
void mapSumFree(MapSum* obj) {
MapSum* p;
p=obj;
obj=obj->next;
free(p);
while(obj!=NULL)
{
p=obj;
obj=obj->next;
free(p->string);
free(p);
}
}
/**
* Your MapSum struct will be instantiated and called as such:
* struct MapSum* obj = mapSumCreate();
* mapSumInsert(obj, key, val);
* int param_2 = mapSumSum(obj, prefix);
* mapSumFree(obj);
*/
写个链表搞定一切。。。 其实重要的还是内存控制。