| |
|
开发:
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){ ? ? ? ? ? ? ? ? ? ? ?//调用冰箱类中的打开冰箱门的方法 ? ? ? ? ? ? ? ? ? ? ?//调用大象类中的被装进冰箱的方法 ? ? ? ? ? ? ? ? ? ? ?//调用冰箱类中关闭冰箱门的方法 ? ? ? ? ? ? ? ?} ? ? ? ? ? } ? ? ? ? ? ? ?? ? ? ? ? ? ?? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |