当前位置: 首页 > 知识库问答 >
问题:

代码优化 - 如何解决LeetCode每日一题中遇到的疑难问题?

罗智志
2024-01-17

在写leetcode每日一题的过程中遇到了一些无法解决的问题。

我进行了多次调试,虽然解决了问题,但是解决的莫名奇妙,也不知道为啥突然就能运行了。。。

题目描述:
给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。

如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配:

字符串 words[i] 等于 words[j] 的反转字符串。
0 <= i < j < words.length
请你返回数组 words 中的 最大 匹配数目。

注意,每个字符串最多匹配一次。
示例 1:

输入:words = ["cd","ac","dc","ca","zz"]
输出:2
解释:在此示例中,我们可以通过以下方式匹配 2 对字符串:

  • 我们将第 0 个字符串与第 2 个字符串匹配,因为 word[0] 的反转字符串是 "dc" 并且等于 words[2]。
  • 我们将第 1 个字符串与第 3 个字符串匹配,因为 word[1] 的反转字符串是 "ca" 并且等于 words[3]。
    可以证明最多匹配数目是 2 。
    就是这个示例
    当我这么写代码时:
int isPalindrome(char* str,char* str2){    int length = strlen(str);    int len = strlen(str2);    int i,j;    for(i = 0,j = len - 1;i < length,j >= 0;i++,j--){        //printf("%c",str[i]);        if(str[i] != str2[j]){            return 0;//不是回文串        }    }    return 1;//是回文串返回1}int maximumNumberOfStringPairs(char** words, int wordsSize){    int count = 0;    for(int i = 0;i < wordsSize;i++){        for(int j = i + 1;j < wordsSize;j++){            if(isPalindrome(words[i],words[j]) == 1){                printf("words[i] = %s\n",words[i]);                count++;            }        }    }    return count;}

运行出来的结果就没问题
words[i] = cd
words[i] = ac
num = 2

当我把isPalindrome函数中的for(i = 0,j = len - 1;i < length,j >= 0;i++,j--)写成i = 0,j = len - 1;i < length,j > 0;i++,j--)。
运行结果就变成了这样:
words[i] = cd
words[i] = cd
words[i] = ac
num = 3
这是为什么啊,明明在maximumNumberOfStringPairs函数中的for循环内对words[i]进行了遍历,只有words[0] = "cd"啊,怎么会出来两次,就弄不明白这里。

共有2个答案

王佐
2024-01-17
  • 判断是否为回文,不得先检查长度是否相等吗?
  • i < length, j >= 0 逗号运算符,表达式的值取决于最后一个子表达式的值,也就是j >= 0
  • 注意,每个字符最多匹配一次

     for(int i = 0;i < wordsSize;i++){      for(int j = i + 1;j < wordsSize;j++){          if(isPalindrome(words[i],words[j]) == 1){              printf("words[i] = %s\n",words[i]);              count++;          }      }  }
阎祖鹤
2024-01-17

这个问题涉及到C语言中的字符串处理和数组索引。在你的代码中,isPalindrome函数是用来检查两个字符串是否是回文串的。问题在于,你在修改了循环条件后,没有正确地初始化变量j的值。

在你的代码中,isPalindrome函数的循环条件被修改为i < length, j > 0,这意味着j的值在每次循环开始时没有被重新设置为字符串的末尾。因此,当i增加时,j的值保持不变,导致了对同一个字符串的多次比较。

为了解决这个问题,你需要在每次外部循环开始时将j重新设置为字符串的末尾。你可以通过在每次外部循环开始时将j初始化为wordsSize - 1来实现这一点。下面是修改后的代码:

int isPalindrome(char* str, char* str2) {    int length = strlen(str);    int len = strlen(str2);    int i, j;    for (i = 0, j = len - 1; i < length && j >= 0; i++, j--) {        if (str[i] != str2[j]) {            return 0; // 不是回文串        }    }    return 1; // 是回文串返回1}int maximumNumberOfStringPairs(char** words, int wordsSize) {    int count = 0;    for (int i = 0; i < wordsSize; i++) {        for (int j = i + 1; j < wordsSize; j++) {            if (isPalindrome(words[i], words[j]) == 1) {                printf("words[i] = %s\n", words[i]);                count++;            }        }    }    return count;}

在上面的代码中,我在外部循环中添加了j = wordsSize - 1,这样在每次外部循环开始时,j都会被重新设置为字符串数组的最后一个元素的索引。这样就可以避免对同一个字符串进行多次比较的问题。

 类似资料:
  • 今天分享的是设计面试中关于工作经验的问题:工作中遇到最大的困难是什么?如何解决的?结果如何? 面试官的可能目的: 1.真假辨认:确认你实习经历的真实性,是真的实习还是美化包装的说辞,通常会从细节中泄露出来; 2.思维方式:你是如何定义“最大的困难”的,为什么会视这个问题为最大的困难(这会反映出你的眼界和思维方式); 3.能力模型:确认你从解决问题中积累了哪些经验,锻炼了哪些能力,是不是和JD相符;

  • 任何人都可以帮助我解决这个问题AndroidManifest.xml mainactivity.kt

  • 尝试了所有方法来通过测试用例,但仍然只显示一个错误。我不知道如何纠正这个错误。 输入:1534236469 实际输出:1056389759 预期输出:0 我不知道为什么我的代码没有给出输出0。

  • 本文向大家介绍解决Pycharm 中遇到Unresolved reference 'sklearn'的问题,包括了解决Pycharm 中遇到Unresolved reference 'sklearn'的问题的使用技巧和注意事项,需要的朋友参考一下 解决方法: 在编程过程中,遇到很多错误,提示都是unresolved reference,在进行先关搜素后,从stackoverflow上的相关问题得到

  • 要求:尽量充分的利用类型推导,而不用额外写一写奇奇怪怪的东西。 问题点: func(str) 有正常的类型推导,很完美; func(obj.bbb) 为什么不能像前者一样? 我知道可以下面两种办法: 类型断言(Type Assertion) 类型声明 我想知道有没有更好的办法?

  • 我是Python的初学者,我正试图学习如何使用数据结构,如JSON对象,但我在试图从JSON对象中实际获取数据时遇到了困难。 我可以通过已经有的代码打印文件中的数据,但是我只想打印某个值,比如的值。我如何使用我已经有的代码打印这个?