版权声明:

本文由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();
  }
 
以上就是我这十天的学习内容,对的,哈哈,十天我就学习了这么一点点东西,重点是自己真的理解没有。虽然速度很慢很慢,但是自己还是觉得有收获的。最重要的是慢慢开始客服畏难的心理,对数据结构有了一点点认识。我很开心自己的进步!

数组和链表--Java学习笔记(一)的更多相关文章

  1. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  2. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  3. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  4. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 20145330第八周《Java学习笔记》

    20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...

  7. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

  8. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  9. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

随机推荐

  1. 土地购买(bzoj 1597)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  2. 经受时间沉淀的15 个 Android 通用流行框架大全

    1. 缓存 名称描述 DiskLruCache: Java实现基于LRU的磁盘缓存 2.图片加载 名称描述 Android    Universal Image Loader 一个强大的加载,缓存,展 ...

  3. MapReduce工作原理图文详解

    目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 1.MapReduce作业运行流程 流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向Job ...

  4. 海外建VPS并支持VPN

    推荐 DigitalOcean http://www.digitalocean.com/?refcode=7c26aea99ed6

  5. OS X 下不通过Homebrew安装ASP.NET 5开发环境

    在 ASP.NET 的 Home repo 里,推荐使用 Homebrew 安装开发环境,不过我的电脑里已经有 ports 了,这应该是当年用 rvm 安装 Ruby 时悄悄地装上的吧.不管怎样,作为 ...

  6. ip二进制计算,与运算算网段

    每8位二进制,各位从左到右对应的权值分别是 128,64,32,16, 8,4,2,1 .(即2的n-1次方,n是从右到左当前位的位数)  所以随便拿一个256以内的数给你化为二进制,都可以分解为权值 ...

  7. 前端优化 - 打开速度1s

    先看一下网页的加载流程: 1.解析html结构2.加载外部脚本和样式表文件3.解析并执行脚本(脚本会阻塞页面的加载)4.DOM树构建完成 (DOMContentLoaded)5.加载图片等外部文件6. ...

  8. 建立jackrabbit内容仓库实例

    jackrabbit需要内容仓库主目录和内容仓库配置文件这两部分的信息才能创建一个运行时内容仓库实例. 1.内容仓库主目录结构 2.Repository.xml的配置文件结构

  9. 【面试题】D

    一面: 1.介绍实习项目,负责那一部分: 2.C++的三大特性: 3.7层网络协议:应用层协议有哪些,TCP/IP属于哪一层,三次握手: 4.Linux: 4.1.查看进程: 4.2.vim文件与to ...

  10. Python爬虫学习(9):Selenium的使用

    1 简介以及安装 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Seleni ...