IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Day07(打印杨辉三角,数据加密问题,冒泡排序,二分查找,面向对象概述) -> 正文阅读

[数据结构与算法]Day07(打印杨辉三角,数据加密问题,冒泡排序,二分查找,面向对象概述)

一、打印杨辉三角

1 0 0 0 0 arr[0][0]

1 1 0 0 0 arr[1][0],arr[1][1]

1 2 1 0 0 arr[2][0],arr[2][2]

1 3 3 1 0

1 4 6 4 1

……

分析规律:

? ? 1、任意一行的第一列与最后一列都是1

? ? 2、从第三行开始,除去第一列和最后一列,每一列的书都是它上一行前一列与上一行本列之和

实现步骤:

? ? 1、首先定义一个二维数组,行数可以是n,列数也可以定义成n,这个n可以是我们将来手动输入指定的

? ? 2、给这个二维数组中任意一行的第一列,和最后一列赋值1

? ? 3、按照我们找到的规律,给其他元素进行赋值,从第三行开始,除第一列和最后一列,其余的数据都是它上一行的前一列与上一行本列的和。

? ? 4、遍历这个二维数组

import java.util.Scanner;

public class YangHuiDemo{

? ? public static void main(String[] args){

? ? //创建键盘录入对象

? ? Scanner sc = new Scanner(System.in);

? ? System.out.println("请输入你想要的杨辉三角的行数:");

? ? int n = sc.nextInt();

? ? //定义一个二维数组

? ? int[][] arr = new int[n][n];

? ? //给这个二维数组中任意一行的第一列和最后一列赋值1

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

? ? ? ? arr[i][0] = 1;//给每一行的第一个元素赋值1

? ? ? ? arr[i][i] = 1;//给每一行的最后一个元素赋值1

}

//按到我们找到的规律,给其他元素进行赋值

//从第三行开始,除第一列和最后一列,其余的数据都是它的上一行的1前一列与上一行本列的和

? ? for(int i = 2;i<arr.length;i++){

? ? //注意:由于我们每一行的第一列与最后一列都赋值了1

? ? //所以我们每一行从第二列开始赋值,一直赋值到倒数第二列,arr[i].length-2

? ? ? ? ?for(int j = 1;j<arr[i].length-1;j++){

? ? ? ? ? ? ?//都是它上一行的前一列与上一行本列的和

? ? ? ? ? ? ?arr[i][ j] = arr[i-1][ j-1] + arr[i-1][ j];

? ? ? ? ?}

? ? ? }

? ? ? //遍历二维数组

//? ? ? ?for(int i = 0;i<arr.length;i++){

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

? ? ? ? ? ? ? ? ?System.out.println(arr[i][ j]+ ",");

? ? ? ? ? ? ? }

? ? ? ? ? ? ? System.out.println();

? ? ? ? ? }

? ? ? ? ?//类似于九九乘法表

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

? ? ? ? ? ? ?for(int j=0;j<=i;j++){

? ? ? ? ? ? ? ? ?System.out.println(arr[i][j]+ "\t");

? ? ? ? ? ? ?}

? ? ? ? ? ? ?System.out.println();

? ? ? ? ? }

? ? ?}

}

二、数据加密问题

? ? ? 1、某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:

? ? ? ?首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来

? ? ?难点:数据长度不固定

? ? ?题目要求:?

? ? ? ? ? ? 1、数据是小于8位的整数? ? ?int number = 123456

? ? ? ? ? ? ?2、加密规则:a:首先将数据倒序:654321

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b:将每位数字都加上5,再用和除以10的余数代替该数字:109876

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?c:最后将第一位和最后一位数字交换:609871

? ? ? ? ? ? ?3、把加密后的结果在控制台打印出来

? ? ?通过分析后,我们发现为了计算方便,我们采用数组存放这些数据,然后进行加密:

? ? ? ? ? ? ?int num = 123456

? ? ? ? ? ? 1、问题:数组的长度是多少呢?

? ? ? ? ? ? ?由于长度是不可能是大于8的,我们就把长度定义成8

? ? ? ? ? ? ? ?int[] arr = new int[8];

? ? ? ? ? ? 2、将数据每一位赋值在数组中,定义一个索引记录赋值的变化

? ? ? ? ? ? ? ? ? int index = 0;

? ? ? ? ? ? ?3、如何获取整数中的每一位数呢?

? ? ? ? ? ? ? int geWei = num%10;//6

? ? ? ? ? ? ? intshiWei = num/10%10;//5

? ? ? ? ? ? ? intbaiWei = num/10/10%10;//4

? ? ? ? ? ? ? ……

? ? ? ? ? ? ? //题目要求一开始将数据倒序,我们按照反方向赋值

? ? ? ? ? ? ? arr[index] = geWei;

? ? ? ? ? ? ? index++;

? ? ? ? ? ? ? arr[index] = shiWei;

? ? ? ? ? ? ? index++;

? ? ? ? ? ? ? arr[index] = baiWei;

? ? ? ? ? ? ? index++;

? ? ? ? ? ? ? ……

public class ShuJuJiaMiDemo1{

? ? ?public static void main(String[] args){

? ? ? ? ? //定义一个不大于8位的整数

? ? ? ? ? int num? = 123456;

? ? ? ? ? //定义一个数组,存储数据

? ? ? ? ? int[] arr = new int[];

? ? ? ? ? //把数据中的每一位放到数组中,由于题目要求第一步就是逆序

? ? ? ? ? //我们干脆就直接倒着赋值

/*

? ? ? ? ? ? int index = 0;

? ? ? ? ? ? arr[index] = num%10;

? ? ? ? ? ? index++;

? ? ? ? ? ? arr[index] = num/10%10;

? ? ? ? ? ? index++;

? ? ? ? ? ? arr[index] = num/10/10%10;

? ? ? ? ? ? index++;

? ? ? ? ? ? arr[index] = num/10/10/10%10

? ? ? ? ? ? index++;

? ? ? ? ? ? arr[index] = num/10/10/10/10%10

? ? ? ? ? ? index++;

? ? ? ? ? ? arr[index] = num/10/10/10/10/10%10

? ? ? ? ? ? index++;

*/

//123456

//由于我们今后会改进成手动输入,长度是不确定,我们用while循环赋值

? ? ? ? int index = 0;

? ? ? ? while (num > 0){

? ? ? ? ? ? ?arr[index] = num % 10;/654321

? ? ? ? ? ? ?index++;//123456

? ? ? ? ? ? ?num = num/10;//12345,1234,123,12,1,0

? ? ? ? }

? ? ? ? //将每位数字都加上5,再用和除以10的余数代替该数字,for循环修改

? ? ? ? //注意:这里给数组元素做变化的时候需要注意的一点是,操作到index的位置停止,因为我们输入的数据长度就到index

? ? ? ? for (int i =0;i<index;i++){

? ? ? ? ? ? ?arr[i] += 5;

? ? ? ? ? ? ?arr[i] %=10;

? ? ? ? ?}

? ? ? ? ?//最后将第一位和最后一位数字交换

? ? ? ? ?int temp = arr[0];

? ? ? ? ?arr[0] = arr[index-1];

? ? ? ? ?arr[index-1] = temp;

? ? ? ? ?System.out.println("123456加密后的数据为:");

? ? ? ? ? for(int i = 0;i < index;i++){

? ? ? ? ? ? ? System.out.println(arr[i]);

? ? ? ? ? ?}

? ? ?}

}

2、磁盘录入数据改进数据加密

import java.util.Scanner;

public static void main(String[] args){

? ? ?//创建键盘录入对象

? ? ?Scanner sc = new Scanner(System.in);

? ? ?boolean flag = true;

? ? ?while (flag) {

? ? ? ? ?System.out.println("请输入你要输入的整数,长度要小于8");

? ? ? ? ?int number = sc.nextInt();

? ? ? ? ?if (number || number > 9999999){

? ? ? ? ? ? ? System.out.println("输入的数据有误,请重新输入!!");

? ? ? ? ? }else {

? ? ? ? ? ? ? jiaMi(numaber);

? ? ? ? ? ? ? flag = flase;

? ? ? ? ? ?}

? ? ??}

}

public static void jiaMi(int num){

? ? System.out.println("加密前数据:\r\n" + num);

? ? ?//定义一个数组,存储数据

? ? ?int[] arr = new int[8];

? ? ?// 由于我们今后会改进成手动输入,长度是不确定,我们用while循环赋值

? ? ?int index = 0;

? ? ?while (num > 0){

? ? ? ? ?arr[index] = num % 10;//6 5 4 3 2 1?

? ? ? ? ?index++;// 1 2 3 4 5 6

? ? ? ? ?num = num/10;//123456 1234 123 12 1 0

? ? ?}

? ? ?//将每位数字都加上5,再用和除以10的余数代替该数字,for循环修改

? ? ?//注意:这里给数组元素做变化的时候需要注意一点的是,操作到index的为止停止,因为我们输入的数据长度就到index

? ? ? ? ?for?(int i = 0;i < index;i++){

? ? ? ? ? ? ? arr[i] +=5;

? ? ? ? ? ? ? arr[i] %=10;

? ? ? ? ? }

? ? ? ? ? ?//最后将第一位和最后一位数字交换

? ? ? ? ? ?int temp = arr[0];

? ? ? ? ? ?arr[0] = arr[index- 1];

? ? ? ? ? ?arr[index-1] = tepm;

? ? ? ? ? ?System.out.println("加密后的数据为:");

? ? ? ? ? ?for (int i = 0;i < index;i++){

? ? ? ? ? ? ? ?System.out.println(arr[i]);

? ? ? ? ? ? }

? ? ? }

}

3、基本数据类型当作参数传递的时候

? ? ? ? ?int a = 10;

? ? ? ? ?int b = 20;

? ? ? ? ?updateNumber(a,b);

? ? ? ? ?System.out.println("a:" + a + ",b:" + b);//10,20

}

public static void updateNumber(int a,int b){

? ? ? ? a = 100;

? ? ? ? b = 200;

System.out.println("a:" + a + ",b:" + b);

}

注意:基本数据类型当作参数传递的时候,传递的是实际的值,方法中的操作改变,不影响,调用外的变量值。

?4、引用数据类型当作参数传递

public static void main(String[] args){file:///E:/兰智数加学院学习内容/Java/day07/引用数据类型当作参数传递.png

? ? ?int[] arr = {12,13,14,15};

? ? ?int[] arr2 = updateArr(arr);

? ? ?System.out.println(arr2[1]);//100

? ? ?System.out.println(arr[1]);//100

}

public static int[] updateArr(int[] array){

? ? ? array[1] = 100;

? ? ? return array;

}

三、冒泡排序

?冒泡排序:相邻的两个依次比较大小并交换

比较交换一轮后,不一定就是有序的

0(n) 最佳情况序列本身就是有序的

0(n^2)? 最差的情况就是全部逆序

public class BubbleSoft{

? public static void main(String[] args){

? ? ? //使用冒泡排序对一组数进行排序,使得最终结果是一个从小到大的顺序

? ? ? int[] arr = {11,23,45,22,1,45,25,6,19};

? ? ? System.out.println("排序之前:");

? ? ? printlnArray(arr);

? ? ? System.out.println();

? ? ? //定义一个方法实现对数组的冒泡排序

? ? ? int[] arr1 = bubbleSoft(arr);

? ? ? ?System.out.println("排序之后:");

? ? ? ?printArray(arr1);

}

public static void printArray(int[] arr){

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

? ? ? ? ?if(i == arr.length - 1){

? ? ? ? ? ? ?System.out.print(arr[i] + "]");

? ? ? ? ?} else if (i == 0){

? ? ? ? ? ? ? System.out.print("[" + arr[i] + ",");

? ? ? ? ? } else {

? ? ? ? ? ? ? ?System.out.print(arr[i] + ",");

? ? ? ? ? ?}

? ? ?}

}

//定义方法实现冒泡排序

//返回值类型:int[]

//参数类型:int[] arr

public static int[] bubbleSoft(int[] arr){

? ? for (int i = 0;i<arr.length -1;i++)?{//外层控制排序的次数

? ? ? ? ?for (int j?= 0;j<arr.length - i - 1,j++){

? ? ? ? ? ? ?if (arr[j] > arr[j] + 1){

? ? ? ? ? ? ? ? ? ?int temp = arr[j];

? ? ? ? ? ? ? ? ? ?arr[j] = arr[j + 1];

? ? ? ? ? ? ? ? ? ?arr[j + 1] = temp;

? ? ? ? ? ? ? }

? ? ? ? ?}

? ? }

? ? return arr;

? }

}? ?

四、二分查找:前提:序列必须是有序的。换句话说,在进行二分查找之前,一组书必须是排过序的,或者本身就是有序。

假设由一组数据经过了排序后是从小到大的顺序

[1,11,19,22,23,25,45,45,68]

然后,我要在这一组数中,查找一个元素25.如果擦回到了,打印该元素的下标索引

目标数:25

?1、在查找开始之前,定义好start,end,mid三个指针,start指向0索引,end指向length-1索引,mid指针指向(start+end)/2.

2、拿mid指向的那个元素与要查找的元素比较,如果相同,查找到元素,结束查找

? ? ? a:如果比他小,start不变,end = mid-1,mid = (strt+end)/2;

? ? ? b:如果比他大,end不变,start = mid + 1,mid=(start + end)/2

3、重复第二个步骤,注意start永远不可能大于end,如果start等于end,说明mid也是如此,当这个时候mid指向元素值还是不等要查找的值的时候,说明该序列中没有要查找的元素,查找结束。

代码实现二分查找:

public class Test3{

? ? public static void main(String[] args){

? ? ? ?int[] arr={1,11,19,22,23,25,45,45,68}

? ? ? ?int number = 100;

? ? ? ?//判断数组是否为空

? ? ? ?if(arr !=null){

? ? ? ? ? ?//定义start

? ? ? ? ? ?//起始位置

? ? ? ? ? ?int start = 0;

? ? ? ? ? ?//结束位置

? ? ? ? ? ? int end = arr.length - 1;

? ? ? ? ? ? //中间指针

? ? ? ? ? ? int mid = (start + end)/2;

? ? ? ? ? ? boolean flag = true;

? ? ? ? ? ? //由于不知道循环的次数

? ? ? ? ? ? while (start <= end){

? ? ? ? ? ? ? ? ?int midValue = arr[mid];

? ? ? ? ? ? ? ? ?if (number == midValue){

? ? ? ? ? ? ? ? ? ? ?System.out.println("找到元素" + number + ",下标索引位:" +mid);

? ? ? ? ? ? ? ? ? ? ?flag = false;

? ? ? ? ? ? ? ? ? ? ?break;

? ? ? ? ? ? ? ? }else if (number < midValue){

? ? ? ? ? ? ? ? ? ? ? end = mid -1;

? ? ? ? ? ? ? ? ? ? ? mid = (start + end)/2;

? ? ? ? ? ? ? ? ?}else {

? ? ? ? ? ? ? ? ? ? ? ?start = mid + 1;

? ? ? ? ? ? ? ? ? ? ? ? mid = (start + end)/2;

? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? }

? ? ? ? ? ? ? if (flag) {

? ? ? ? ? ? ? ? ? System.out.println("数组中没有元素" + number);

? ? ? ? ? ? ? ?}

? ? ? ? ? } else {

? ? ? ? ? ? ? ?System.out.println("数组为空");

? ? ? ? ? ?}

? ? ?}

}

五、面向对象的思想概述

1、什么是面向对象的思想?

? ? ?面向对象的思想是基于面向过程的思想发展而来的。

? ? ?面向过程:强调的是实现功能的每一个步骤

? ? ?面向对象:强调的是对象,然后有这个对象去调用功能

2、面向对象的特点:

? ?(1)是一种更加符合我们现实生活习惯的思想

? ?(2)可以将复杂的事情简单化

? ?(3)我们从之前的参与者(执行者)变成了指挥者

举例:

? ? ?吃饭:

? ? ? ? ? ? 面向过程的思想:先去市场买菜--洗菜--切菜--做菜--装盘--吃

? ? ? ? ? ? 面向对象的思想:点外卖--厨师做菜--打包--外卖小哥送餐

需求:将大象装进冰箱

? ? ? ? ? ?面向过程的思想:

? ? ? ? ? ? ? ? ? 分析过程:

? ? ? ? ? ? ? ? ? ? ? ? ? 1、打开冰箱门

? ? ? ? ? ? ? ? ? ? ? ? ? 2、把大象装进冰箱

? ? ? ? ? ? ? ? ? ? ? ? ? 3、关闭冰箱门

伪代码实现:

? ?class Demo{

? ? ? ? public static void main(String[] args){

? ? ? ? ? ? System.out.println("打开冰箱门");

? ? ? ? ? ? //注意,打开冰箱门这个动作肯定不是一行输出语句就能搞定的

? ? ? ? ? ? //现在只是为了演示面向过程的思想,就用一句输出语句代替

? ? ? ? ? ? //假设将来我们在这个程序中要开很多次门

? ? ? ? ? ? //我们可以将打开冰箱门这个功能封装成一个方法,然后main方法调用

? ? ? ? ? ?//同理,以及把大象装进冰箱以及关闭冰箱门

? ? ? ? ? ?open();

? ? ? ? ? ?put();

? ? ? ? ? ?close();

? ? ? }

? ? ? ?public static void open(){

? ? ? ? ? ? //写打开冰箱门的功能实现代码

? ? ? ? ? ? System.out.println("打开冰箱门");

? ? ? ? }

? ? ? ? ?public static void put(){

? ? ? ? ? ? ?//写把大象装进冰箱的功能实现代码

? ? ? ? ?}

? ? ? ? ?public static void close(){

? ? ? ? ? ? ? //写关闭冰箱门的功能实现代码

? ? ? ? ? }

? ??}

面向对象的思想:

? ? 面向对象的思想实现该需求:

? ? ? ? ?1、我们要考虑需求中有哪些类?

? ? ? ? ? ? ?如何分析有哪些类呢?

? ? ? ? ? ? ? ? ?方式1:需要用到UML这门课的知识

? ? ? ? ? ? ? ? ?方式2:名词提取法

? ? ? ? ? ? ? 使用第二种方式分析有哪些类?

? ? ? ? ? ? ? ? ? 题目:将大象装进冰箱

? ? ? ? ? ? ? ? ? 大象类,冰箱类,测试类

? ? ? ? ?2、每个类中都有些什么?

? ? ? ? ? ? ? 大象类:

? ? ? ? ? ? ? ? ? ? ?属性:体积,鼻子,脚掌,象牙……

? ? ? ? ? ? ? ? ? ? ?功能:被装进冰箱,喝水,叫……

? ? ? ? ? ? ? 冰箱类:

? ? ? ? ? ? ? ? ? ? ?属性:品牌,价格,材质……

? ? ? ? ? ? ? ? ? ? ?功能:打开冰箱们,关闭冰箱门……

? ? ? ? ? ? ? ?测试类:(创建对象,适用对象的地方)

? ? ? ? ? ? ? ? ? ? ?main方法,实现需求

? ? ? ? ?3、类与类之间的关系又是什么呢?

? ? ? ? ? ? ? 测试类中使用大象类和冰箱类完成需求

伪代码实现:

? ? //定义一个大象类

? ? classs Elephant{

? ? ? ? ?体积;

? ? ? ? ?鼻子;

? ? ? ? ?象牙;

? ? ? ? ? 被装进冰箱();

? ? ? ? ? ?喝水();

? ? ? ? ? ?叫();

? ? ? ?}

? ? ? ? //定义一个冰箱类:

? ? ? ? ?class IceBox{

? ? ? ? ? ? ? 品牌;

? ? ? ? ? ? ? 价格;

? ? ? ? ? ? ? 材质;

? ? ? ? ? ? ? 打开冰箱门();

? ? ? ? ? ? ? 关闭冰箱门();

? ? ? ? ? }

? ? ? ? ? //定义一个测试类实现需求

? ? ? ? ? ?class Demo{

? ? ? ? ? ? ? ? ?public static void main(String[] args){

? ? ? ? ? ? ? ? ? ? ?//调用冰箱类中的打开冰箱门的方法

? ? ? ? ? ? ? ? ? ? ?//调用大象类中的被装进冰箱的方法

? ? ? ? ? ? ? ? ? ? ?//调用冰箱类中关闭冰箱门的方法

? ? ? ? ? ? ? ?}

? ? ? ? ? }

? ? ? ? ? ? ??

? ? ? ? ? ??

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:15:37  更:2022-01-12 00:19:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:35:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码