[leetCode刷题笔记]2017.02.01

本文介绍了几种链表操作的方法,包括链表的翻转、旋转、分区及排序等。通过具体的代码实现展示了如何解决这些常见问题。

25. Reverse Nodes in k-Group

这道题有点小复杂。

先求出list的长度。再在while-loop中套一个for-loop,for-loop中将k个node进行reverse,然后再移动到下组

public class Solution {

    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode prevNode = new ListNode(0);
        prevNode.next = head; 
        ListNode curr = prevNode;
        // get the list length
        int i =  count(head);
        while (i >= k) {
            // reverse k node in the list
            for (int j = 0; j < k - 1; j++) {
                ListNode nextNode = curr.next; 
                curr.next = head.next;  
                head.next = curr.next.next;  
                curr.next.next = nextNode;  
            }
            curr = head;  
            head = head.next; 
            i -= k;
        }
        return prevNode.next;
    }
    private int count(ListNode head) {
        ListNode curr = head;
        int i= 0;
        while (curr != null) {
            i++;
            curr = curr.next;
        }
        return i;
    }

}


61. Rotate List


这道题先获得尾部node,再将尾部node的next连上head形成一个环。k可能大于list长度n,所以获得断开点的位置是n - k % n,断开后再返回指针即可。

public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null) {
            return head;
        }
        ListNode tail = head;
        int length = count(head);
        // get the tail of List
        while (tail.next != null) {
            tail = tail.next;
        }
        // generate the circle
        tail.next = head;
        ListNode breakNode = tail;
        
        for (int i = 0; i < (length - k % length); i++) {
            breakNode = breakNode.next;
        }
        ListNode output = breakNode.next;
        // break the circle
        breakNode.next = null;
        return output;
    }
    private int count(ListNode head) {
        ListNode curr = head;
        int i= 0;
        while (curr != null) {
            i++;
            curr = curr.next;
        }
        return i;
        
    }
}


86. Partition List

将list按X分成两段,小的的一段大的一段,再连起来。。。

public class Solution {
   public ListNode partition(ListNode head, int x) {
        ListNode big = new ListNode(0);
        ListNode bigCurr = big;
        ListNode small = new ListNode(0);
        ListNode smallCurr = small;
        //遍历
        while(head != null){
            if(head.val < x){//<x成一组
                smallCurr.next = head;
                smallCurr = smallCurr.next;
            }
            else {//>=x成一组
                bigCurr.next = head;
                bigCurr = bigCurr.next;
            }
            head = head.next;
        }
        smallCurr.next = big.next;
        bigCurr.next = null;//斩断后面的连接
        return small.next;
    }
}

148. Sort List

重复使用merge two sorted list方法,将list不断分成两部分,分别进行排序。mergesort思想。。。

public class Solution {
     public ListNode sortList(ListNode head) {  
        if (head == null || head.next == null) {  
            return head;  
        }  
  
        ListNode fast = head;  
        ListNode slow = head;  
        while (fast.next != null) {  
            fast = fast.next.next;  
            if (fast == null) {  
                break;  
            }  
  
            slow = slow.next;  
        }  
        // slow node current in center
        ListNode right = slow.next;  
        slow.next = null;  
  
        ListNode left = sortList(head);  
        right = sortList(right);  
  
        return mergeTwoLists(left, right);  
    }  
     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode lastNode = dummy;
        
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                lastNode.next = l1;
                l1 = l1.next;
            } else {
                lastNode.next = l2;
                l2 = l2.next;
            }
            lastNode = lastNode.next;
        }
        
        if (l1 != null) {
            lastNode.next = l1;
        } else {
            lastNode.next = l2;
        }
        
        return dummy.next;
    }
}

物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值