)
一循环循环三要素1.初始化表达式初始值 2.迭代表达式循环体 3.循环出口表达式结束条件1.while循环先判断后执行结构while(boolean表达式){ 语句块被重复执行的操作 }//boolean表达式为真true时执行语句块否false则退出例package day01;package day01; public class MyWhile{ public static void main(String[] args){ System.out.println(brgin); int n1;// 初始值 while(n5){//结束条件 System.out.println(hello world);//循环体 n; } System.out.println(end); int sum0;//保存所有num和 int num21; while(num210){ sumsumnum2; num2; } System.out.println(sum); int sum20; int i1; while(i100){ if(i%20){ sum2sum2-i; }else{ sum2sum2i; } i; } System.out.println(sum2); //1/11/31/51/7...1/99 //2n-1 n1 1 n2 3 n3 5 n50 2*50-1 double s0; int j1; while(j50){ // s0 j1 s01/1 // s1 j2 s11/3 // s2 j3 s11/31/5 // s1..1/971/99 ss1.0/(2*j-1); j; } System.out.println(s); } }while的死循环while(true){ 语句块 }例import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { Random random new Random(); Scanner scannernew Scanner(System.in);//键盘输入函数 int a random.nextInt(100);//随机生成一个1-100数字 while (true){//死循环 System.out.println(请输入一个数字0-99)); int b scanner.nextInt(); if(ba) { System.out.println(大了); }else if(ba) { System.out.println(小了); }else { System.out.println(对了); break;//必须使用break跳出死循环否则将一直循环进行下去输出结果会一直运行 } } } }break与continue:break:用于循环语句或switch语句结束整个当前循环不能结束多个循环continue:只能用于循环中跳过循环体中剩余语句而执行下一个循环结束本次循环进入下一次循环例//不输出3的倍数 int m1; while(m10){ m; if(m%30){ continue;//结束本轮循环,不再执行后面的代码,开始下一轮循环 } System.out.println(m); }2.do-while循环先执行后判断结构do{ 语句块 }whileboolean表达式int n1; do{ System.out.println(n); n; }while(n5);第一条件不满足时do-while比while多执行一次满足时两者执行次数和结果一模一样3.for循环结构for表达式1表达式2表达式3{ 语句块循环体 }运算顺序计算表达式1——计算表达式2——(为假false)跳出循环 计算表达式1——计算表达式2——为真true执行循环体——计算表达式3——计算表达式2...for的死循环for{ 语句块 }例for(int i1;i10;i){ /* * 1. int i1 110 输出i * 2. i2 210 输出i * * ... * 10. i10 1010 输出i * */ System.out.println(i); } int j1; for(;j100;j){ } System.out.println(jj); for(;;){//死循环 }4.嵌套for循环打印相关图形以及遍历复杂的函数嵌套循环规则内循环执行结束后才会执行第二次外循环例//嵌套循环执行规则 //内循环执行结束后,才会执行第二次外循环 for(int i1;i5;i){//外循环 System.out.println(ii); for (int j1;j6;j){//内循环 System.out.println(jj); } }嵌套循环使用break例boolean flagfalse; for (int i 1; i 5 ; i) { if(flag){ break; } System.out.println(ii); for(int j1;j3;j){ if(j2){ flagtrue; break; //break只能结束最近的一层循环 } System.out.println(j***********--j); } }break只能结束当前循环不能结束多个循环可以使用标记的方式结束多层循环例//嵌套for循环 //规则:外循环执行一次,内循环执行全部,再次执行一次外循环,内循环执行全部.... out://标记 使用break标记终止多层循环 for (int i 1; i 3; i) {//外循环 System.out.println(i:i); inner: for (int j 1; j 5; j) {//内循环 if(j3){ break out;//只终止当前循环(离自己最近的循环) } System.out.println(j:j); }for循环的应用例题package day03; import java.util.Random; import java.util.Scanner; public class UseFor { public static void main(String[] args) { //循环用法 //1.随机生成9-30之间的整数,用户可以猜这个数 //要求: //1).用户可以一直猜,直到猜对为止 //2).当猜的数比随机数大提示猜大了反之猜小了 //3).猜对时提示 恭喜 答对了 //4).输入-1退出 Scanner scannernew Scanner(System.in); Random randomnew Random(); int randNumrandom.nextInt(22)9; System.out.println(随机数:randNum); while(true){ System.out.println(请输入:); int guessNumscanner.nextInt(); if(guessNum-1){ System.out.println(欢迎下次再来!!); break; } if(guessNumrandNum){ System.out.println(猜大了); }else if(guessNumrandNum){ System.out.println(猜小了); }else{ System.out.println(恭喜答对了!!!); break; } } } }嵌套for循环的应用例题//九九乘法表 for (int i 1; i 9; i) {//9行 for (int j 1; j i; j) { System.out.print(j*i(i*j)\t); } System.out.println(); }//矩形图形 for (int i 1; i 5; i) {//外循环控制行数 for (int j 1; j 11 ; j) {//内循环控制列数 System.out.print(*); } }二数组程序算法数据结构 数组是最基本的用的最多的一种数据结构1.定义定义数组时长度length必须确定数据类型 [ ] 数组名 new 数据类型 [ 长度 ]例 int [ ] arr new int [ 10 ]; //即定义了一个int型的长度为10的arr数组[0000000000] int 的默认值为02.下标(index)数组通过下标获取每一个元素下标从0开始到数组长度-1特点数组元素是顺序排列的数组在内存中的地址是连续的 数组在内存中的存储通过下标访问数组数组名[下标]例//定义数组 //定义一个整型数组 存储3个数据 int[] arrnew int[3];//定义一个长度为3的整型数组 //特点:数组元素是顺序排列的 数组在内存中的地址是连续的 System.out.println(arr); //下标:数组下标是从0开始-长度-1截止 0表示数组的第一个元素 //通过下标访问数组:数组名[下标] System.out.println(arr[2]); arr[0]5; //给数组的第一个元素赋值为5 arr[1]3; arr[2]10; // arr[3]6;//不能超过下标的最大范围 长度-1 System.out.println(arr[2]); int[] arr2{1,2,3,4,5}; //定义一个整型数组,长度为数组元素的个数,按照下标从左到右赋 值 System.out.println(arr2[3]); int[] arr3; arr3new int[5]; arr3[0]2; int arr4[]; arr4new int[]{1,3,5,7,9};3.数组初始化方式一int [] arr {10,23,30,-10,21};//元素的个数即为数组的长度 方式二int [] arr; arr new int [] {10,23,30,-10,21};4.数组的长度属性调用数组的length属性可以获取数组的长度例int [] arr{10,4,2,6,8,9,3,1}; int len arr.length; System.out.println(数组长度为:len);//数组长度为8 System.out.println(arr[0]);//获取数组的首元素 System.out.println(arr[arr.length-1]);//获取数组的尾元素5.数组元素访问int [ ] arrnew int [ ]{4568}int temp arr[2]//获取第三个元素66.数组的遍历普通forint[ ]arr new int [10]; for(int 0;iarr.length;i){//iarr.length,防止下标越界超出范围 arr [i]100; }增强forfor 数组类型 变量名数组名{语句块...}double[] arr{1.23,3.14,5.26,1.35,1};//创建数组arr并赋值 for(double d:arr){//增强for循环遍历arr中每一个double元素d接收每一个元素 System.out.print(d );//输出结果1.23,3.14,5.26,1.35,1.0 } System.out.println(); double[] arr2new double[5];//创建数组arr2没有赋值double默认值为0.0 for(double d:arr2){ System.out.println(d);//每个元素单独打印一行输出结果0.0 0.0 0.0 0.0 0.0 } char[] chnew char[3];//创建数组ch没有赋值char默认值为\u0000 ch[0]65;//ASCII码对应大写字母A赋值给数组下标为0的位置 ch[1]X; ch[2]O; for(char c:ch){//增强for循环遍历数组c接收每个字符 System.out.print(c );//输出结果A,X,O } boolean[] booleansnew boolean[5];//boolean默认值为false for(boolean boo:booleans){//增强for循环遍历数组 System.out.println(boo); } booleans[0]21;//表达式21结果为true赋值给数组下标为0的位置注意这里写在了循环的后面循环到上一行就结束了所以最终输出结果为:false false false false false String[] strsnew String[3]; //String默认值为null //strs[0]java;//这里strs[0]被注解了没有数值所以打印输出null strs[1]python; strs[2]C#; for(String s:strs){//增强for循环遍历数组 System.out.println(s);//输出结果null python C# } }7.动态赋值//数组动态赋值 Scanner scannernew Scanner(System.in); System.out.println(请输入数组长度:); int arrLengthscanner.nextInt(); int[] arrnew int[arrLength];//创建指定长度的数组 for (int i 0; i arr.length; i) {//作用:初始化数组元素 System.out.println(请输入第(i1)个元素值:); arr[i]scanner.nextInt(); } for(int n:arr){//遍历输出 System.out.print(n\t); }8.数组最值查找数组中的最大值或最小值例//查找数组中的最大值 //1.定义一个变量,把首位元素赋给该变量,假设数组中的第一个元素是最大值,第一个元素和 数组中的所有元素两两比较 //2.只要后面元素比当前元素大,把大的值赋给变量 int[] arr{20,27,5,3,18,32,16,55,-10}; int maxarr[0]; for (int i 1; i arr.length; i) { //i1 2027 max27 //i2 if(maxarr[i]){ maxarr[i]; } } System.out.println(最大值:max);9.数组元素交换数组元素可以使用下标方式进行值的交换例int[] arr{1,2,3,4,5,6}; //将1和3进行交换 int temparr[1]; arr[1]arr[3]; arr[3]temp; for(int n:arr){ System.out.print(n ); }10.数组复制使用System.arraycopy()方法可以实现数组的复制 public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) src: ——原数组 srcPos: ——原数组中的起始位置 dest: ——目标数组 destPos : ——目标数组的起始位置 length: ——要复制的数组元素的数量例//数组复制 //例1 int[] arr{2,3,4,1,6,5,8};//源数组 int[] arr2new int[arr.length];//目标数组 0 0 0 0 0 0 0 0 //从arr数组 第2个元素开始复制 到arr2中,在arr2中起始位置开始粘贴,共复制5个长度 System.arraycopy(arr,2,arr2,0,5); for(int n:arr2){ System.out.print(n ); }//例2 String[]a{1,2,3,4,5}; String[]b{A,B,C,D,E}; System.arrcopy(b,0,a,4,a.lengtth-4); //把数组b里面下标为0的数复制然后粘贴给数组a中下标为4的数 //最后输出结果为1 2 3 4 A11.数组扩容数组的长度在创建后是不可以改变的需要创建一个更大的新数组然后将原数组的内容复制进去 可以通过Arrays.copyOf()方法简便的实现数组的扩展例//数组扩容 int[] arr{1,2,3,4,5,6,7,8}; int[] arr2 Arrays.copyOf(arr,5);//将arr数组中的元素复制到新数组,复制的个数取决于 新数组的长度 for(int n:arr2){ System.out.print(n ); } System.out.println(); arrArrays.copyOf(arr,arr.length5); arr[8]9; for(int n:arr){ System.out.print(n ); }动态扩容//循环的往数组中存入值输入当数组长度不够时进行扩容 Scanner scanner new Scanner(System.in);//Scanner键盘输入 int []arr new int [3];//初始长度为3 int index 0; while (true){ System.out.println(请输入第(index1)个值输入-1退出); int numscanner,nextInt(); if(num-1){ break; } boolean flagfalse; //验证数组中是否还有0这个元素有暂不扩容没有扩容3 for(int i 0;iarr.length;i){ if(arr[i]0){ flagtrue; break; } } //如果flag为true不需要扩容 if(flag){ arr[index]num; }else{ arrArrays.copyOf(arr,arr.length3); arr[index]num; } index; } for(int n:arr){ System.oout.print(n ); }12.数组排序重点讲冒泡排序和选择排序冒泡排序稳定选择排序不稳定选择排序交换次数更少1冒泡排序第一次找到所有元素中的最大值或最小值放在最后一个位置上不再变动 第二次找到剩余所有元素中的最大值或最小值放在倒数第二个位置上不在变动 以此类推直到排序完成 比较时既可以采用“下沉”的方式也可以采用“上浮”的方式实现例思路逻辑下沉法对应代码int []arr{27,13,42,8,35,19}; for(int i0;iarr.length-1;i){//外循环 找最大值的次数 for(int j0;jarr.length-i-1;j){//内循环 每一轮循环比较的次数 if(arr[j]arr[j1]){//前面比后面大交换位置 int temparr[j]; arr[j]arr[j1]; arr[j1]temp; } } } for(int n:arr){ System.out.print(n ); }2选择排序每一轮在未排序的区间里找到最小值的下标把最小值和未排序区间的第一个元素做交换。和冒泡不一样冒泡是相邻元素不停交换选择排序每一轮只做 1 次交换。对应代码public class SelectSort { public static void main(String[] args) { int []arr{27,13,42,8,38,19}; //外层i未排序区间起始位置一共length‑1轮 for(int i 0; i arr.length - 1; i){ //假设未排序第一个元素就是最小值记录下标 int minIndex i; //内层j从i1开始遍历未排序部分找真正最小值下标 for(int j i 1; j arr.length; j){ if(arr[j] arr[minIndex]){ minIndex j; //更新最小值下标 } } //每一轮结束交换未排序开头i 和最小值下标minIndex int temp arr[i]; arr[i] arr[minIndex]; arr[minIndex] temp; } //输出数组 for(int num : arr){ System.out.print(num ); } } }3.工具类排序Array.sort(arr);//对数组从小到大排序int[]arr{20,4,16,32,12}; Array.sort(arr); for(int n:arr){ System.out.print(n ); }三.数组和循环结合的一些例题合并两个有序数组例import java.util.Arrays; public class EX9 { public static void main(String[] args) { int[] a {2, 5, 8, 11}; int[] b {3, 6, 9, 14}; int[] arr new int[a.length b.length]; int index 0; //复制a数组 for (int i 0; i a.length; i) { arr[index] a[i]; index; } //复制b数组 for (int i 0; i b.length; i) { arr[index] b[i]; index; } // 冒泡排序一定要放在main方法里面 for (int i 0; i arr.length - 1; i) { for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } System.out.println(Arrays.toString(arr)); } }数组整体循环右移例int []arr{10,20,30,40,50}; for(int count0;count2;count){ int temparr[arr.length-1]; for(int iarr.length-1;i0;i--){ arr[i]arr[i-1]; } arr[0]temp; } System.out.println(Arrays.toString(arr)); //输出结果[40 50 10 20 30 ]统计元素重复次数例int[]arr{5,2,7,2,5,5,9,2,5}; int[]countnew int [arr,length1]; for(int i0;iarr.length;i){ int numarr[i]; count[num];//这里num是int []arr这个的下标 } for(int x0;xcount.length;x){ if(count[x]0){//这里是int[]count的下标 System.out.println(数字x,出现count[x]次); } //输出结果数字2出现3次 数字5出现4次 数字7出现1次 数字9出现1次删除数组指定元素例//删除8这个元素 int[]arr{15,8,22,8,31,8,44}; int count0; for(int i0;iarr.length;i){ if(arr[i]!8){ count; } } int[]arr2new int[count]; int index0; for(int i0;iarr.length;i){ if(arr[i]!8){ arr2[index]arr[i]; index; } } System.out.println(Arrays.toString(arr2)); //输出结果[15,22,31,44]手写二分查找例查找目标元素19找到则输出对应下标未找到则输出-1int[]arr{3,7,11,15,19,24,30,36}; int target19; int left0; int rightarr.length-1; int index-1; while(leftright){ int mid (leftright)/2; if(arr[mmid]target){ indexmid; break; } else if(arr[mid]target){ leftmid1; } else{ rightmid-1; } }System.out.println(index); //输出结果4数组元素反转例int[]arr{1,2,3,4,5,6,7}; int[]arr2new int[arr.length]; for(int i0;iarr.length;i){ arr2[i]arr[arr.length-1-i]; }System.out.println(Arrays.toString(arr2)); //输出结果[7,6,5,4,3,2,1](勤练习多做题先审题确定元素明确思路理清先什么再什么再开始写避免无从下手或写出来的代码混乱没有条理)