leetCode 算法
58题(简单)
问题描述:最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
int lengthOfLastWord(char * s){
int sz = strlen(s);
if(sz>=1&&sz<=10000){
int flag = 0;//用来标记单词后面有无空格
int i = 0;
int num = 0;//计算最后一个单词的数字
//遍历字符
for(i = 0;i<=sz;i++){
if(*(s+i)!='\0'){//判断是否读到字符串结尾
if(*(s+i)==' '&&flag==0){
flag = 1;
}else if(*(s+i)!=' '&&flag==0){
num++;
}else if(*(s+i)!=' '&&flag==1){
num = 1;
flag=0;
}
}
}
return num;
}
return 0 ;
}
结论:做算法题的时候不要很快就下手,先标记处题目的细节要求,然后写下自己大概的实现思路,再动手写代码。但是自己写的是最蠢最蠢的办法,所以内存消耗的多。代码要进行优化,要拿时间换内存。
T66 加一(简单)
问题描述:给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int arr(int* digits, int digitsSize){
int i =0;
for(i=0;i<digitsSize;i++){
if(digits[i]>9||digits[i]<0){
return 0;
}
}
return 1;
}
int* plusOne(int* digits, int digitsSize, int* returnSize){
if(1<=digitsSize&&digitsSize<=100&&arr(digits,digitsSize)){
int i=0;
for(i = digitsSize-1;i>=0;i--){
if(digits[i]!=9){
digits[i]=digits[i]+1;
*returnSize = digitsSize;
return digits;
}
digits[i] = 0;
}
*returnSize = digitsSize+1;
digits = (int*)malloc(sizeof(int)*(*returnSize));
for(i = 0;i<=digitsSize;i++){
digits[i]=0;
}
digits[0] = 1;
return digits;
}
return NULL;
}
结论:刚开始没有思路,看一下大佬们的评论然后开始写,第一次执行的时候总是只出来一个‘】’,还以为是自己的逻辑问题,然后查看代码。发现自己的思路是没问题的,但是函数参数中有一个returnSize的参数在我的函数中没有任何的作用,我这才想起来,函数返回的是一个指针,只能指出一个值,我得要告诉他我的数组的元素个数,他才能完整的显示出来。 但是加上后又出现了一个错误,
百度之后发现是因为我用来返回的tmp数组是局部变量,所以函数结束后位置会归还系统。所以我采取了动态分配的方式。
data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
这种问题有以下几种解决方法。
修改方法一般有3种:
1)返回的指针提前分配空间
2)用static修饰变量
3)使用全局变量
参考:https://blog.csdn.net/weixin_42066185/article/details/108913650
来源:力扣(LeetCode)