你这个感叹号大了点,用半角的
不知道你这个问题是否已经解决, 如果还没有解决的话:对于力扣刷题时,涉及到数据结构的相关问题,比如链表的性质,l1.var可以根据语言不同而有所不同,一般来说,l1是定义的链表指针(或者头节点),var是作为变量使用;例如Java语言中,ListNode l1 = new ListNode(1)生成一个链表的头节点,l1.val表示节点的值,l1.next表示指向下一个节点的指针。所以l1.var应该是错误的表达方式。
当代码在运行过程中产生错误,需要分析错误原因,可以先查看错误提示信息,再详细检查代码部分,排查错误。在Java语言中,错误信息可能包括类型错误、空指针错误、数组越界等等,可以根据错误提示信息来查找具体位置,然后在对应位置进行代码调试,如果需要,也可以加入log信息辅助分析问题。以下是一个代码出错所示的错误提示信息以及代码部分示例。
错误提示信息:
Exception in thread "main" java.lang.NullPointerException at Solution1.printArray(Solution1.java:17) at Solution1.main(Solution1.java:53)
代码部分示例(Java语言):
public class Solution1 { public static void main(String[] args) { int[] nums = null; printArray(nums); } public static void printArray(int[] nums) { for (int num : nums) { System.out.print(num + " "); } System.out.println(); } }
这里的错误提示信息是空指针异常,说明主函数中的nums数组为空;错误发生在第17行,即printArray(nums)方法中,因为在调用printArray方法时传入的nums是空的,它没有任何元素,所以在第17行循环体中将nums中的元素输出时,出现了空指针异常。因此可以改为给nums数组赋予一个非空的初始值,从而避免出现空指针问题,例如:int[] nums = {1,2,3};
对于给定一个字符串,计算这个字符串中有多少个回文子串的问题,可以采用动态规划解决。假设dp[i][j]表示字符串s从下标i到j是否是回文串,如果dp[i][j]是true,则表示是回文串,否则不是回文串,可以通过以下状态转移方程计算:
当 s[i] == s[j] && (j-i<=2 || dp[i+1][j-1]) 时,dp[i][j] = true;
其中j-i<=2是根据题目的条件当i和j离得非常近的时候,比如j-i<=2的话,dp[i][j]也是回文子串;如果s[i] != s[j],那么dp[i][j]一定不是回文串。
由于还需要用到数组中前一个值的信息,因此我们需要从下往上、从左往右进行遍历,保证每个dp[i][i]在计算时所需的dp[i+1][j-1]都已计算过,具体代码实现如下:
class Solution { public int countSubstrings(String s) { int len = s.length(); boolean[][] dp = new boolean[len][len]; int count = 0; for (int i = len - 1; i >= 0; i--) { for (int j = i; j < len; j++) { if (s.charAt(i) == s.charAt(j) && (j - i <= 2 || dp[i + 1][j - 1])) { dp[i][j] = true; count++; } } } return count; } }
对于给定一个单链表,把所有的奇数节点和偶数节点分别排在一起的问题,可以采用原地算法完成,即不增加新的链表空间,只是将原链表的节点进行重新排列。一个简单的做法是创建两个指针odd和even分别指向奇数链表的第一个节点和偶数链表的第一个节点,遍历原链表,将奇数节点和偶数节点分别加入到奇数链表和偶数链表中。最后将奇数链表的尾节点指向偶数链表的头节点,即可完成链表的重新排列。具体代码实现如下:
class Solution { public ListNode oddEvenList(ListNode head) { if (head == null || head.next == null) return head; ListNode odd = head, even = head.next, temp = even; while (even != null && even.next != null) { odd.next = even.next; odd = odd.next; even.next = odd.next; even = even.next; } odd.next = temp; return head; } }
其中odd表示奇数节点组成的链表的最后一个节点,even表示偶数节点组成的链表的最后一个节点,temp表示偶数链表的头节点。循环条件是even != null && even.next != null,因为如果链表长度为偶数,那么even会停留在倒数第二个节点上,否则even会停留在最后一个奇数节点上,不需要进行任何操作。