讨论/技术交流/小白的疑惑:关于Leetcode提交记录中的执行用时和内存消耗/
小白的疑惑:关于Leetcode提交记录中的执行用时和内存消耗

疑惑一

在写2. 两数相加的时候,用了大致两种方式,第一种是new出来的链表然后返回,第二种是原地存储返回。

但是似乎两者测评差距体现不出来,下文进行了多次测评,感觉内存消耗指标参考意义不大。

有人说,系统测评信息是用一个程序调用这个Java类的方法然后统计出来的信息,个人感觉说的有道理,那么假设方法体是空的,运行肯定是需要一个基础的内存资源s,若方法体非空,额外消耗是t,那么内存消耗应该是s+t,下文中两种方法空间消耗指标在多次测评时,数值交叉严重,是因为s远大于t而造成s的波动影响更大么?也就是说,内存消耗的测评好不好就看s了?除非对于某题来说t影响因素更大?


第一种方式

new ListNode()
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(),temp=head;
        int add=0;
        while(l1!=null || l2!=null || add!=0){
            temp.next=new ListNode();
            temp=temp.next;
            if(l1!=null) {
                add += l1.val;
                l1 = l1.next;
            }
            if (l2!=null) {
                add += l2.val;
                l2 = l2.next;
            }
            temp.val= add%10;
            add/=10;
        }
        return head.next;
    }
}
多次测评截图

1
image.png
2
image.png
3
image.png
4
image.png
5
image.png


第二种方式

原地
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(), temp = head, extend = l2, po = l1;
        int add = 0;
        while (true) {
            temp.next = po;
            temp = temp.next;
            if (l1 != null) {
                add += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                add += l2.val;
                l2 = l2.next;
            }
            temp.val = add % 10;
            add /= 10;
            if (po.next == null) po.next = extend;
            if (l1 != null || l2 != null || add != 0) po = po.next;
            else {
                po.next = null;
                break;
            }
        }
        return head.next;
    }
}
多次测评截图

1
image.png
2
image.png
3
image.png
4
image.png
5
image.png

疑惑二

同一题同一方法不同语言的测评疑惑,发现许多题是这样的,下面是一个例子

6.Z字形变换

以官方题解为例,方法一:按行排序,有C++和Java两个实现

下图为测评截图,依然各是五次
image.png

由上图可以看出,C++版本的内存消耗和Java的泾渭分明。时间上部分测评接近但是C++的时间消耗整体上大于Java。不是都说C++的执行效率比Java高么?

1
共 1 个回复

1.力扣的Java提交是不包括启动jvm的,由于优化太多了,单纯的解释时间实际上要少于c++的时间
2.力扣上面的时间可以看看,空间没有什么意义。一方面空间很便宜,另一方面力扣这个本来就不是稳定的计算

1