目录
第1题:搜索插入位置
第2题:外观数组
第3题:最大子序和
第4题:最后一个单词的长度
第5题:加一
第6题:二进制求和
第7题:求平方根
第8题:爬楼梯
第9题:删除排序链表中的重复元素
第10题:合并两个有序数组
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第1题:搜索插入位置
试题要求如下:
回答(C语言):
int searchInsert(int* nums, int numsSize, int target){ int num=0; if(numsSize<=0) return 0; for(int i=0,j=1;i<numsSize;i++,j++){ if(target<nums[0]){ num=0; break; } else if(target>nums[numsSize-1]){ num=numsSize; break; } else{ if(nums[i]==target) { num=i; break; } if(target>nums[i] && target<nums[j]){ num=j; break; } } } return num; }
第2题:外观数组
试题要求如下:
回答(C语言):
char * countAndSay(int n){ if(n==1) return "1"; char *s=countAndSay(n-1); char *a=(char *)malloc(5000); char *ans=(char *)malloc(5000); int count=0; int l=strlen(s); int j=0; for(int i=0;i<l;i++){ if(i == 0 || s[i]==s[i-1]) count++; else{ a[j++]='0'+count; a[j++]=s[i-1]; count=1; } if (i == l - 1) { a[j++]='0'+count; a[j++]=s[i]; } } a[j]='\0'; ans = a; return ans; }
第3题:最大子序和
试题要求如下:
回答(C语言):
int maxSubArray(int* nums, int numsSize){ int max = nums[0]; int b = 0; for(int i = 0; i < numsSize; i++){ b += nums[i]; if(b > max) max = b; if(b < 0) b = 0; } return max; }
第4题:最后一个单词的长度
试题要求如下:
回答(C语言):
int lengthOfLastWord(char * s){ int num=strlen(s); int len=0; if(num<=0) return 0; //重后往前,若有空格,则去掉空格 //若全为空格则返回0 while(s[--num]==' '){ if(num==0){ return 0; } } while(num>=0){ if(s[num--]==' ') break; len++; } return len; }
第5题:加一
试题要求如下:
回答(C语言):
int* plusOne(int* digits, int digitsSize, int* returnSize){ int *buf=(int *)malloc((digitsSize + 1) * sizeof (int)); for(int i=digitsSize-1;i>=0;i--){ if(digits[i]+1==10){ digits[i]=0; } else{ digits[i]+=1; returnSize[0]=digitsSize; return digits; } } buf[0]=1; for(int i=0,j=1;i<digitsSize;i++,j++) buf[j]=digits[i]; returnSize[0]=digitsSize+1; return buf; }
第6题:二进制求和
试题要求如下:
回答(C语言):
char * addBinary(char * a, char * b){ int num=0,len_a=strlen(a),len_b=strlen(b),len_long=0; if(len_a>=len_b){ len_long=len_a+2; } else{ len_long=len_b+2; } char *buf=(char *)malloc(sizeof(char)*(len_long)) ; buf[--len_long]='\0'; buf[0]='0'; while(len_long>0){ num+=len_a>0?a[--len_a]-'0':0; num+=len_b>0?b[--len_b]-'0':0; if(num==0){ num=0; buf[--len_long]='0'; } else if(num==1){ num=0; buf[--len_long]='1'; } else if(num==2){ num=1; buf[--len_long]='0'; } else if(num==3){ num=1; buf[--len_long]='1'; } } if(buf[0]=='0') return buf+1; else return buf; }
第7题:求平方根
试题要求如下:
回答(C语言):
int mySqrt(int x){ //牛顿迭代法 long r = x; while(r * r > x) { r = (r + x / r) / 2;//迭代 } return (int)r; }
第8题:爬楼梯
试题要求如下:
回答(C语言),算法说明:
int climbStairs(int n){ if (n == 1) { return 1; } int *dp=(int *)malloc(sizeof(int)*(n+1)); dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }
第9题:删除排序链表中的重复元素
试题要求如下:
回答(C语言):
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* deleteDuplicates(struct ListNode* head){ struct ListNode * p = head; struct ListNode * q; while(NULL != p) { while(NULL != p->next && p->val == p->next->val) { q = p->next; p->next = q->next; free(q); } p = p->next; } return head; }
第10题:合并两个有序数组
试题要求如下:
回答(C语言):
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ int p = m + n; m--; n--; while (n >= 0 && m >= 0) { nums1[--p] = nums1[m] <= nums2[n] ? nums2[n--] : nums1[m--]; } while (n >= 0) { nums1[--p] = nums2[n--]; } }