• 数组和链表


    版权声明:

        本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处.

      我两年前在上海一家人力资源公司从事流程管理、质量监控的工作,3年工作经验。后来来到硅谷,发现软技能在美国无用武之地后,经过半年的思考,终于决定转行学习CS, 硬技术才是王道啊!决定后,我开始找寻学习的方向:(1)最开始接触html和css,后来发现兴趣不大,感觉这种东西更像是word,三个月后放弃;(2)然后听说APP特别火,于是尝试着摸索objectC,发现面向对象完全无法理解,三个月后,决定放弃。 (3)然后开始接触JAVA,听了国内曹学松老师的一些网络课程,感觉还有点感觉。速度很慢的把计算机的基础知识补充了一下。最近开始学习算法和数据结构,同时练习一些相关的leetcode的题目(只敢做easy)。终于有了那么一点点入门的感觉了!

      下面谈谈最近一个阶段学习的东西:

      最近10来天主要学习的数据结构和算法,主要看的是数组和链表。

        一、数组

       数组的概念对于我来说相对容易理解一些,在大学通过C语言二级的时候就有所接触。数组方面我主要练习了leetcode上面的两道题,一道是Two Sum,一道是Remove Duplicate from sorted array.

     (一) Two Sum的过程中主要学习到了HashTable,HashTable最方便的地方是有一种对应关系,可以通过值,直接返回下标。具体用法如下:

    (1)导入:
    import java.util.HashMap;
    import java.util.Map;
    (2)初始化
    Map<Integer,Integer> map= new HashMap<>();
    (3)把元素放进hashmap里面
    for(int i=0;i<nums.length;i++)
        {
          map.put(nums[i],i);
        }
    (4)找到这个target并且返回它的下标
    if(map.containsKey(complement)){
            return new int map.get(complement);
          }

    (二)Remove Duplicate学习的过程中主要学习到了Two pointer的一个算法,我认为双指针中,首尾指针比较好理解,但是快慢指针我理解了一个下午。我开始总是认为快慢指针都是用来遍历的,后来才发现原来一个用来保存,一个用来遍历。

    1.i是一个慢指针,j是一个快指针。
    2.一个用来遍历,一个用来保存处理过的元素。遇到相同的继续遍历;遇到不同的,保存。
    3.它最后返回的不是新的数组,而是数组的长度。所以只需要计算出一个指针的长度就可以了。
    4. nums[i]=nums[j];这一步的意义在于永远是前一个指针和后一个指针的比较。
    5.此方法只是计数,并没有多分配任何一个新的空间。 
     
    完整程序
    public static int RemoveDuplicates(int[] nums){
        if(nums.length==0){
          return 0;
        }
        int i=0;
        for(int j=0;j<nums.length;j++){
          if(nums[j]!=nums[i]){
            i++;
            nums[i]=nums[j];
          }
        }
        return i+1;
      }
     
    除此以外,我更加熟悉了函数的调用和函数的写法,对Java的大体结构有了更深的了解。
    问题:首次接触到时间复杂度和空间复杂度,但是对这两个概念还没有完全理解。并且编写程序时也不会去考虑这个两个重要的因素。
     
    二、链表
    链表的概念我理解起来就非常痛苦了,中间去youtube上面找了两个视频来看,理解到一点皮毛。后来通过练习了leetcode的一道习题,Reverse Linked List。搞了我整整两天,终于对它有了一点肤浅的理解。但是主函数内对于链表的一些基本的class用法,使用起来倒是蛮容易理解的。
     
    Reverse Linked List
    这道题目我开始还以为和数组一样,居然尝试用首尾双指针这种做法来做,后来发现链表和数组差别真的太大了。链表更像是一个完整的不可断开的整体,它的节点和根节点显得尤其重要。本来这道题是可以运用递归来完成的,但是我实在理解不了。先暂时理解迭代吧!
    1.cure.next=prev 代表curr的下一个指针指向prev,有使链表转向的功能。
    2.nextTemp=curr.next 代表这个元素是curr的下一个元素。
    3.一个单项链表的反转至少要用到三个变量:prev、curr、nextTemp
    4.ListNode不是指的一个链表,而是一个链表的节点。
     
    反转链表的写法,完整程序:
    public static ListNode ReverseList(ListNode head){
          ListNode prev=null;
          ListNode curr=head;
          while(curr!=null){
            ListNode nextTemp=curr.next; (把节点的下一个节点指出来)
            curr.next=prev; (反向指,最重要的一步)
            prev=curr;       (移动,知道prev变成头结点)
            curr=nextTemp;
          }
          return prev;
      }
     
    这个标准答案基本可以理解以后,我尝试在主函数内对其进行调用。才发现链表的调用也完全不一样:
     
    1.链表的输入:(node表示节点),非常不一样的做法是一个节点一个节点的输入
    ListNode node=new ListNode(1);
    node.next=new ListNode(2);
    node.next.next=new ListNode(3);
     
    printList(node);
     
    2.链表的调用:
    ListNode newHead=new Solution().ReverseList(node);
    printList(newHead);
     
    3.printList并非系统自带的class,所以你还得自己写一个出来。
     程序:
     private static void printList(ListNode node) {
        ListNode cur = node;
        while (cur != null) {
          System.out.print(cur.val + "->");
          cur = cur.next;
        }
        System.out.println();
      }
     
    以上就是我这十天的学习内容,对的,哈哈,十天我就学习了这么一点点东西,重点是自己真的理解没有。虽然速度很慢很慢,但是自己还是觉得有收获的。最重要的是慢慢开始客服畏难的心理,对数据结构有了一点点认识。我很开心自己的进步!
  • 相关阅读:
    OpenFace 调试记录
    Q-Q图和P-P图
    混沌理论(Chaos theory)和非线性系统
    vxlan 协议
    浮动IP地址(Float IP)与 ARP欺骗技术
    Huawei® ENSP & VRP CheatSheet
    多分类问题中查全率和查准率的理解
    urllib 报错 IOError: [Errno socket error] TLS/SSL connection has been closed (EOF) (_ssl.c:590)
    小世界网络
    表型数据(Phenotype Data)基本概念
  • 原文地址:https://www.cnblogs.com/zuofeiyi/p/linked-list-and-array-java-learning-notes-1.html
Copyright © 2020-2023  润新知