力扣(LeetCode)刷题,简单题+中等题(第20期)

举报
不脱发的程序猿 发表于 2020/12/28 01:04:54 2020/12/28
【摘要】 目录 第1题:判断能否形成等差数列 第2题:整数拆分 第3题:魔术索引 第4题:连续数列 第5题:字符串相加 第6题:数组拆分1 第7题:找出数组中的幸运数 第8题:期望个数统计 第9题:检查单词是否为句中其他单词的前缀 第10题:"气球”的最大数量 力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案...

目录

第1题:判断能否形成等差数列

第2题:整数拆分

第3题:魔术索引

第4题:连续数列

第5题:字符串相加

第6题:数组拆分1

第7题:找出数组中的幸运数

第8题:期望个数统计

第9题:检查单词是否为句中其他单词的前缀

第10题:"气球”的最大数量


力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

第1题:判断能否形成等差数列

试题要求如下:

回答(C语言):


  
  1. int cmp(const void *a, const void *b)
  2. {
  3. return *((int*)a) - *((int*)b);
  4. }
  5. bool canMakeArithmeticProgression(int* arr, int arrSize){
  6. qsort(arr, arrSize, sizeof(int), cmp);
  7. int minus = arr[1] - arr[0];
  8. for (int i = 0; i < arrSize; i++) {
  9. if (arr[i] != (arr[0] + i * minus)) {
  10. return false;
  11. }
  12. }
  13. return true;
  14. }

运行效率如下所示:


第2题:整数拆分

试题要求如下:

解答思路:

1、当n <= 3的时候,由提议n >=2 ,因此当n = 2的时候,只有 1 + 1,因此返回1,当n = 3的时候,2 + 1 ,则返回2,所以n <= 3的时候直接返回n - 1;

2、当n > 3的时候,我们用动态规划,dp[n] = Max(dp[n - 1] * 1, dp[n - 2] * 2,dp[n - 3] * 3 ....,dp[1] * (n - 1))
这里面对dp中1,2,3的初始化很重要,比如dp[4] = Max(dp[3] * 1, dp[2] * 2, dp[1] * 3),显然这里面的dp[1],dp[2],dp[3]分别对应的是值1,2,3,所以初始值就是这样子;

再后面的比如dp[5] = Max(dp[4] * 1, dp[3] * 2, dp[2] * 3, dp[1] * 4),4以及之后的由于都是根据前面正确计算得到的,因此不用再初始化,直接在公式里面循环即可。

回答(C语言):


  
  1. int integerBreak(int n){
  2. if (n <= 3) return n - 1;
  3. int* dp = (int*) malloc(sizeof(int) * (n + 1));
  4. memset(dp, 0, sizeof(int) * (n + 1));
  5. dp[1] = 1;
  6. dp[2] = 2;
  7. dp[3] = 3;
  8. for (int i = 2; i <= n; i++) {
  9. for (int j = 1; j < i ; j++) {
  10. dp[i] = fmax(dp[i], dp[i - j] * j);
  11. }
  12. }
  13. return dp[n];
  14. }

运行效率如下所示:


第3题:魔术索引

试题要求如下:

回答(C语言):


  
  1. int findMagicIndex(int* nums, int numsSize){
  2. for(int i = 0; i < numsSize; i++){
  3. if(nums[i] == i){
  4. return i;
  5. }
  6. }
  7. return -1;
  8. }

运行效率如下所示:


第4题:连续数列

试题要求如下:

回答(C语言):


  
  1. int maxSubArray(int* nums, int numsSize){
  2. int sum = 0;
  3. int max = nums[0];
  4. if (numsSize < 1)
  5. return 0;
  6. for (int i = 0; i < numsSize; i++) {
  7. sum += nums[i];
  8. if (max < sum)
  9. max = sum;
  10. if (sum < 0)
  11. sum = 0; //为负数时忽略其的奉献为0
  12. }
  13. return max;
  14. }

运行效率如下所示:


第5题:字符串相加

试题要求如下:

解答思路:

回答(C语言):


  
  1. char* addStrings(char* num1, char* num2) {
  2. int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
  3. char* ans = (char*)malloc(sizeof(char) * (fmax(i, j) + 3));
  4. int len = 0;
  5. while (i >= 0 || j >= 0 || add != 0) {
  6. int x = i >= 0 ? num1[i] - '0' : 0;
  7. int y = j >= 0 ? num2[j] - '0' : 0;
  8. int result = x + y + add;
  9. ans[len++] = '0' + result % 10;
  10. add = result / 10;
  11. i--, j--;
  12. }
  13. // 计算完以后的答案需要翻转过来
  14. for (int i = 0; 2 * i < len; i++) {
  15. int t = ans[i];
  16. ans[i] = ans[len - i - 1], ans[len - i - 1] = t;
  17. }
  18. ans[len++] = 0;
  19. return ans;
  20. }

运行效率如下所示:


第6题:数组拆分1

试题要求如下:

回答(C语言):


  
  1. int cmp(int *a, int *b) {
  2. return *(int *)a > *(int *)b;
  3. }
  4. int arrayPairSum(int* nums, int numsSize){
  5. int i, j;
  6. int sum = 0;
  7. if (numsSize < 2) {
  8. return 0;
  9. }
  10. qsort(nums, numsSize, sizeof(int), cmp);
  11. for (sum = nums[0], i = 2; i < numsSize; i = i + 2) {
  12. sum += nums[i];
  13. }
  14. return sum;
  15. }

运行效率如下所示:


第7题:找出数组中的幸运数

试题要求如下:

回答(C语言):


  
  1. int findLucky(int* arr, int arrSize){
  2. int ret = -1;
  3. int temp[501] = {0};
  4. int i = 0;
  5. for(; i < arrSize; i++)
  6. {
  7. temp[arr[i]]++;
  8. }
  9. i = 500;
  10. for(; i > 0; i--)
  11. {
  12. if(temp[i] == i)
  13. return i;
  14. }
  15. return ret;
  16. }

运行效率如下所示:


第8题:期望个数统计

试题要求如下:

解答思路:

1、如果数组的长度scoresSize <= 0,返回0;

2、利用快速排序对scores进行排序;

3、遍历数组scores,统计不相同的元素的个数count;

4、返回count。

回答(C语言):


  
  1. int cmp( const void * a , const void * b ){
  2. return *( int * )a - *( int * )b;
  3. }
  4. int expectNumber( int * scores , int scoresSize ){
  5. if( scoresSize <= 0 ){
  6. return 0;
  7. }
  8. qsort( scores , scoresSize , sizeof( int ) , cmp );
  9. int count = 1;
  10. for( int i = 1 ; i < scoresSize ; i++ ){
  11. if( *( scores + i ) != *( scores + i - 1 ) ){
  12. count++;
  13. }
  14. }
  15. return count;
  16. }

运行效率如下所示:


第9题:检查单词是否为句中其他单词的前缀

试题要求如下:

回答(C语言):


  
  1. int isPrefixOfWord(char *sentence, char *searchWord)
  2. {
  3. int cnt = 1;
  4. char *token = NULL;
  5. const char space[2] = " ";
  6. /* 获取第一个子字符串,使用空格分隔 */
  7. token = strtok(sentence, space);
  8. /* 继续获取其他的子字符串 */
  9. while (token != NULL ) {
  10. if (strstr(token, searchWord) == token) {
  11. return cnt;
  12. }
  13. cnt++;
  14. token = strtok(NULL, space);
  15. }
  16. return -1;
  17. }

运行效率如下所示:


第10题:"气球”的最大数量

试题要求如下:

回答(C语言):


  
  1. #define MIN(a, b) (((a) < (b)) ? (a) : (b))
  2. int maxNumberOfBalloons(char * text){
  3. int charCount[26] = {0};
  4. int i, len, ret;
  5. len = strlen(text);
  6. for (i = 0; i < len; i++) {
  7. charCount[text[i] - 'a']++;
  8. }
  9. charCount['l' - 'a'] /= 2;
  10. charCount['o' - 'a'] /= 2;
  11. ret = INT_MAX;
  12. ret = MIN(ret, charCount['b' - 'a']);
  13. ret = MIN(ret, charCount['a' - 'a']);
  14. ret = MIN(ret, charCount['l' - 'a']);
  15. ret = MIN(ret, charCount['o' - 'a']);
  16. ret = MIN(ret, charCount['n' - 'a']);
  17. return ret;
  18. }

运行效率如下所示:

文章来源: blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_38106923/article/details/107812726

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。