循环

for循环

使用方法:如果循环的次数是确定的,一般使用for循环。例如:

int sum=0;
 
   for (int i = 0; i < 100; i++) {
				sum +=i+1;
       }
    System.out.println("100以内的和为:"+sum);

while循环

使用方法:条件表达式成立时,则执行循环体,然后再判断,依次类推,如果条件不满足,有可能一次都不执行。一般用于循环次数不确定的循环
语法:
while(条件表达式){
//语句块;
}
实例:计算100以内的能被3整除之数的和

int i=0;
 	 int sum=0;
 	 while (i<100){
  			if (i%3==0) {
  			 sum+=i;
          					 }
 			  i++;
			 }
  System.out.println("100以内的能被3整除之数的和为"+sum);

switch循环

使用方法:一般用来做分支的,或者是进行选择.
语法:
switch(表达式){
case 取值 1: 语句块 1;break;
case 取值 n: 语句块 n;break;
default: 语句块 n+1;break;
}
switch 语句有关规则;
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
Case 后面的执行体可写{ }也可以不写{ }
实例:根据年份输出天数

switch(month){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
System.out.println(month + "月共有 31 天");
			break;
			case 4:
			case 6:
			case 9:
			case 11:
System.out.println(month + "月共有 30 天");
				break;
				case 2:
System.out.println(month + "月共有 28 天");

数组

什么是数组

数组是相同数据类型的多个数据的容器。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个
元素外,每一个元素都有唯一的后继元素。(“简单理解就是:一个跟一个顺序排列”)。

创建格式

格式 1. 数据类型[] 数组名称 = new 数据类型[数组长度];
格式 2. 数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3…数组内容 n};
格式 3. 数据类型[] 数组名;
格式 3 属于只创建了数组引用名, 并未在内存创建数组空间。
格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3…内容 n};

数组的初始化:静态初始化、动态初始化、默认初始化

//静态初始化:
				int[] arr = { 1, 2, 3 };// 静态初始化基本类型数组;
//动态初始化:
				int[] arr = new int[2];//动态初始化数组,先分配空间;
      arr[0]=1;//给数组元素赋值;
      arr[1]=2;//给数组元素赋值;
//默认初始化:
					int arr[] = new int[2]; // 默认值:0,0
      boolean[] b = new boolean[2]; // 默认值:false,false
      String[] s = new String[2]; // 默认值:null, null

数组算法:冒泡排序

##冒泡排序:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的
    数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
**
 *  两数之和
 * 给定一个整数数组 nums 和一个目标值 target, 请你在该数组中找出和为目标值的那两个整数, 并输出他们的数组下标
 * 假设每种输入只会对应一个答案, 不能重复利用这个数组中同样的元素。
 * 		示例:
 * 		给定 nums = [2, 7, 11, 15], target = 9
 * 		因为 nums[0] + nums[1] = 2 + 7 = 9
 * 		所以输出 0, 1
 */
public class Dome4 {
    public static void main(String[] args) {
        int[]nums={2,11,15,7,13,9};
        int temp;
        int target = 9;
        //首先冒泡排序从小到大排序 或者 arrays.sort 排序
        //外层循环控制的是, 比较的轮数。
        //外层循环次数: length-1
        for (int i =0;i<nums.length-1;i++){
            //内层循环控制的是,每轮比较的次数
            //第i轮(i从0开始计算), 比较次数为:length-i-1
            for (int j=0;j<nums.length-i-1;j++){
                //两两相比,满足移动条件
                if (nums[j]>nums[j+1]){
                    temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
        }
        //排序已经完成。 下面是遍历打印查看的过程
        for (int i=0;i<nums.length;i++){
            System.out.println(nums[i]);
        }
    }

}

二分查找

#原理:
首先,假设数组中元素是按升序排列,将数组中间位置的数据与查找数据比较,如果两者相等,则查找成功;否则利用
中间位置记录将数组分成前、后两个子数组,如果中间位置数据大于查找数据,则进一步查找前子数组,否则进一步查
找后子数组。
重复以上过程,直到找到满足条件的数据,则表示查找成功,
直到子数组不存在为止,表示查找不成功。

/**
	 * 二分查找(折半查找)
	 */
	public static void main(String[] args) {
		int[] nums = {10,20,30,40,50,60,70,80,90};
		
		//要查找的数据
		int num = 20;
		
		//关键的三个变量:
		//1.	最小范围下标
		int minIndex = 0;
		//2.	最大范围下标
		int maxIndex = nums.length-1;
		//3.	中间数据下标
		int centerIndex = (minIndex+maxIndex)/2;
		while(true) {
			System.out.println("循环了一次");
			if(nums[centerIndex]>num) {
				//中间数据较大
				maxIndex = centerIndex-1;
			}else if(nums[centerIndex]<num) {
				//中间数据较小
				minIndex = centerIndex+1;
			}else {
				//找到了数据  数据位置:centerIndex
				break;
			}
			
			if(minIndex > maxIndex) {
				centerIndex = -1;
				break;
			}
			//当边界发生变化, 需要更新中间下标
			centerIndex = (minIndex+maxIndex)/2;
		}
		
		System.out.println("位置:"+centerIndex);
		
	}