用环形队列的数组实现约瑟夫问题java_数据结构和算法

1. 数据结构与算法入门

1.1 经典算法问题:

汉诺塔

八皇后问题

马踏棋盘

1.2 字符串匹配

1.2.1 暴力匹配

1.2.2 KMP算法

1.3 数据结构和算法重要性

算法是程序灵魂

内存计算框架

1.4 数据结构与算法关系

2. 实际算法问题:

2.1 str.replaceAll( str )

2.1.1 问题:

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

2.2 其他几个问题:

丢手帕问题

磁盘问题

公交车

画图

球和篮子

扔石头

修路问题,最小路径

最短路径问题

汉诺塔

八皇后

2.3 线性结构与非线性结构

数据与元素一对一的线性关系

顺序存储,元素都是连续的

链式存储,元素是不连续的

数组,队列,链表和栈

2.3.1 非线性结构

二维数组,多维数组,广义表,树结构,图结构

3. 稀疏数组和队列

3.1 稀疏数组的处理方法:

记录数组一共几行几列,有多少个不同的值

把具有不同值的元素的行列记录在一个小规模数组

3.1.1 二维数组转稀疏数组的方法

遍历原始二维数组,保留有效个数

根据sum创建稀疏数组spareArr intsum+1

二维数组的有效数据存入到稀疏数组

3.2 稀疏数组转二维数组:

先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,

读取稀疏数组的后几行数据,并赋值给原始的二维数组

4. 稀疏数组的Java代码实现

package array;

import java.util.ArrayList;

import java.util.List;

/**

* 稀疏数组

* 1. 需要将二维数组转为稀疏数组存储

* 2. 稀疏数组进行保存(文件读写)

* 3. 读取文件恢复稀疏数组(文件读写)

* 4. 将稀疏数组转回二维数组

* @author zhaoxudong

* @title: SpareceArray

* @projectName structAlgorithms

* @description: 稀疏数组

* @date 2019/8/19 14:54

*/

public class SpareceArray {

/**

* 使用稀疏数组

* @param args 数组

*/

public static void main(String[] args) {

int[][] twoArrayConvertSparecArray = twoArrayConvertSparecArray();

// 稀疏数组如何转为二维住

SparecArrayConverttwoArray(twoArrayConvertSparecArray);

}

/**

* 稀疏数组转为二维数组

*/

private static void SparecArrayConverttwoArray(int[][] array) {

// 1. 根据第一行数据还原出二维数组的行与列

int[][] result = new int[array[0][0]][array[0][1]];

for (int i = 1; i < array.length; i++) {

result[array[i][0]][array[i][1]] = array[i][2];

}

printArray(array);

printArray(result);

}

/**

* 稀疏数组转为二维数组的办法

* 1. 创建二维数组,并且加入数据

* 2.

*/

private static int[][] twoArrayConvertSparecArray() {

// 将二维数组转为稀疏数组 初始化为 11 11

int[][] array = new int[8][8];

List list = new ArrayList();

// 在二维数组放两个子

array[4][5] = 2;

array[3][7] = 11;

array[2][3] = 11;

printArray(array);

// 计算有几个有效数据

// 存储有几个有效数据

int sumCount = 0;

sumCount = calcuArrSize(array, sumCount);

// 创建稀疏数组

int[][] spareceArray = new int[sumCount+1][3];

// 第一行为 个数 棋盘的行 棋盘的列

spareceArray[0][0] = array.length;

spareceArray[0][1] = array[0].length;

spareceArray[0][2] = sumCount;

// 稀疏数组存储数据

//count 用于记录是第几个非0数据

int noZeroCount = 0;

for (int i = 0; i < array.length; i++) {

for (int j = 0; j < array[i].length; j++) {

if(array[i][j] != 0) {

noZeroCount++;

// 存储第几行 第几列 值为多少

spareceArray[noZeroCount][0] = i;

spareceArray[noZeroCount][1] = j;

spareceArray[noZeroCount][2] = array[i][j];

}

}

}

return spareceArray;

}

/**

* 计算有效数据的个数

* @param array 原有的数组

* @param sumCount 计算个数

*/

private static int calcuArrSize(int[][] array, int sumCount) {

for (int i = 0; i < array.length; i++) {

for (int j = 0; j < array[i].length; j++) {

if(array[i][j] != 0) {

sumCount++;

}

}

}

return sumCount;

}

/**

* 打印数组的快捷方法

* @param array 数组

*/

private static void printArray(int[][] array) {

System.err.println("-----------------我是分割线-----------------");

for (int i = 0; i < array.length; i++) {

for (int j = 0; j < array[i].length; j++) {

System.out.print(array[i][j] + "\t" );

}

System.out.println();

}

System.err.println("-----------------我是分割线-----------------");

}

}

5. 队列:

5.1 数组模拟队列

5.1.1 思路分析:addQueue

将尾指针 rear + 1 , 表示入队。当 rear == front 表示空队列

如果rear 等于队列 maxSize - 1, 表示队列满,否则可以增加元素

5.1.2 思路分析:re

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值