数据结构

学前


经典算法面试例题:
        1)有一个字符串str1="123 1234 12345",和一个子串str2="1234"
           现在要判断str1是否含有str2,如果存在,返回第一次出现的位置,否则返回-1
            // KMP算法  -  部分匹配表
        
        2)汉诺塔游戏
           小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
            // 分治算法

        3)八皇后问题
            在8 * 8格的国际象棋上摆放八个皇后
            任意两个皇后都不能处于同一行、同一列、同一斜线上,问有多少种摆法
            // 回溯算法

        4)马踏棋盘(骑士周游问题)
            将马随机放在国际象棋的8 * 8格棋盘上
            按马走日进行移动,每个方格只进入一次,走遍棋盘上全部方格
            // 图的深度优化遍历算法(DFS)+贪心算法优化

数据结构和算法概述

                数据(data)、结构(structure)研究组织数据的方式,提高代码效率及美观
                用程序解决现实生活中的问题
                程序 = 数据结构 + 算法

实际编程中的问题

public static void main(String[] args){
    String str = "Java";
    String newStr = str.replaceAll("MyJava"); // 算法支撑的字符串替换方法
    System.out.println("newStr = "+newStr);
}

//      例:试写出用单链表表示的字符串类及字符串节点类的定义,
//    并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置的成员函数

//      例:五子棋游戏
//    判断游戏输赢,实现存盘退出和继续上局
//    棋盘—>二维数组(稀疏数组)—>写入文件(存档)—>读取文件(读取二维数组)->恢复成二维数组棋盘(接上局)

//      例:约瑟夫问题(丢手帕问题) => 单项环形链表
//          修路问题 => 最小生成树(数据结构 + 普利姆算法)
//         最短路径问题 => 图 + 弗洛伊德算法

线性结构和非线性结构


        线性结构

                特点:数据元素之间存在一对一的线性关系
                存储结构:       顺序存储结构、链式存储结构
                                  顺序存储的线性表称为顺序表,其中存储的元素是连续的
                                  链式存储的线性表称为链表,其中存储的元素不一定连续,元素节点中存放数据元素以及相邻元素的地址信息
                例:数组、队列、链表、栈

        非线性结构

                例:二维数组(多维数组)、广义表、数结构、图结构

稀疏数组和队列


        稀疏(sparsearray)数组


                要求:编写五子棋程序中存盘退出和续上盘功能

                分析问题:存盘使用的二维数组很多值为默认0,记录了很多没有意义的数据 -> 稀疏数组
            当一个数组中大部分元素为同一个值时,使用稀疏数组保存

                处理方法:
            记录数组行列数,不同值的个数
            把具有不同值的元素行列及值记录在一个小规模数组中,缩小程序的规模

                应用实例:
            使用稀疏数组,保留二维数组(棋盘、地图等)
            把稀疏数组存盘,并且可以重新恢复为原来的二维数组

                转换思路:
        1. 遍历原始二维数组,得到有效数据的个数sum
        2. 根据sum创建稀疏数组 sparseArr int [sum+1] [3]
        3. 将二维数组的有效数据存入稀疏数组
            // 将稀疏数组存盘到文件中
        1. 读取稀疏数组的第一行,根据第一行数据,创建原始二维数组
        2. 读取稀疏数组剩余行数据,赋给原始二维数组即可

                代码实现:见eclipse

        队列


                基本概念:
            队列是一个有序列表,可以用数组或链表实现
            遵循先入先出原则

                数组模拟队列
            队列本身是有序列表,用数组结构存储列队数据
            maxSize是列队最大容量,front / rear表示队列前后端,分别随着数据的输入 / 输出而改变
        数据存入队列时称 " addQueue " ,两个步骤:
            1) 将尾指针后移:rear + 1,当front == rear(空)
            2) 若尾指针 rear 小于队列最大下标maxSize - 1 ,则将数据存入数组元素
                否则无法存入数据。 当 rear == maxSize - 1 时,表示队列满

                代码实现:见eclipse









全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 10:46
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:54
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务