输入、控制语句、数组及相关算法(Java学习笔记二)

基本流程结构

  • 顺序结构
  • 分支结构
  • 循环结构

Scanner类

  1. 导入Scanner类;
  2. 实例化Scanner对象;
  3. 调用Scanner类的相关方法,获取指定类型的变量。

根据相应的方法输入相应的值,若输入类型和要求类型不匹配时,会抛异常。

int grade = scan.nextInt();
double weight = scan.nextDouble();
String name = scan.next();

取字符串s索引为0位置上的字符c。

char c = s.charAt(0);

if-else

判断是否是闰年

  1. 可以被4整除但不可被100整除;

    或者

  2. 可以被400整除。


switch

  • 未遇到break,依旧会继续往下执行其余的case语句。
  • switch(表达式)中的表达式只能是以下6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。
  • default结构可选可不选,类似于if-else中的else,且位置不固定。
  • 多个case可以合并。
  • switch-case都可以转换为if-else,但反之不成立。
  • switch-case执行效率比if-else稍高。

while

  • 注意死循环。
  • while和for可以相互转换。

do-while

至少执行一次循环体。


for

for(;;)相当于while(true),属于不限制循环次数的结构。常用break跳出循环。


例题

绘菱形
 		Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n-i;j++){
                System.out.print(" ");
            }
            System.out.print("*");
            for(int j=1;j<=i-1;j++){
                System.out.print(" *");
            }
            System.out.println();
        }
        for(int i=1;i<=n-1;i++){
            for(int j=1;j<=i;j++){
                System.out.print(" ");
            }
            System.out.print("*");
            for(int j=2;j<=n-i;j++){
                System.out.print(" *");
            }
            System.out.println();
        }
输出示例:
    *
   * *
  * * *
 * * * *
* * * * *
 * * * *
  * * *
   * *
    *
输出100以内质数
    	long time1 = System.currentTimeMillis();
       	System.out.println("2");
        label:for(int i=3;i<100;i+=2){
            for(int j=3;j<=Math.sqrt(i);j+=2){
                if(i%j==0){
                   continue label;
                }
            }
            System.out.println(i+" ");
        }
        long time2 = System.currentTimeMillis();
        System.out.println(time2-time1);

break和continue

break结束当前循环。

continue结束当此循环。

break默认跳出离break语句最近的那层循环,如果想跳出更外层的循环,使用标签。同理,continue也可以配合标签使用。

  label:for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                System.out.println(" ");
                if(j<i){
                    break label;
                }
            }
        }

数组

  • 数组是多个相同类型数据按照一定顺序排列的集合。
  • 数组是有序的。
  • 数组属于引用数据类型,数组的元素既可以是基本数据类型,也可以是引用数据类型。
  • 创建的数组对象在内存中是一块连续的内存空间。
  • 数组的长度一旦确定,就不能更改。
一维数组

初始化:

//动态初始化
int[] array1 = new int[5];
//静态初始化
int[] array2 = new int[]{1,2,3,4,5};

获取数组长度:

//获取数组长度
int[] array1 = new int[5];
int len1 = array1.length;
//获取字符串长度
String str = "hello";
int len2 = str.length();

遍历:

for循环、for-each循环。

默认初始化值:

整形->0、浮点型->0.0、char型->0(ASCII码)、boolean型->false、引用数据类型->null

数组内存解析:

在这里插入图片描述


二维数组

初始化:

//动态初始化
int[][] array1 = new int[2][3];
int[][] array2 = new int[2][];
//静态初始化
int[][] array3 = new int[][]{{1,2,3},{},{}...};

其中array1外层元素默认初始值为地址值,内层元素初始值与一维数组相同。

其中array2外层元素默认初始值为null,内层元素初始化值不能调用,会报空指针异常错误。

其余概念类比一维数组很好理解。

例题:杨辉三角。


数组相关算法

1.数组元素的赋值(杨辉三角、回形数等);

2.求最大值、最小值、平均值、总和等;

  		int[] array = new int[5];
        int arrayMax = array[0];
        for(int i=1;i<array.length;i++){
            if(arrayMax < array[i]){
                arrayMax = array[i];
            }
        }

3.数组的复制、反转、查找(线性查找、二分查找);

array1 = array2;//这不是数组的复制,而是赋值。

复制:应当新创建一个数组,通过循环依次赋值原数组的值。

反转:可使用双指针或其他方法。String类型反转可借助StringBuffer中的reverse函数进行。

查找:

  • 线性查找:遍历数组,依次判断每个元素。 O(n)
  • 二分查找:分治思想。(需要先排序) O(lgn)
   public static int binarySearch(int[] num, int target, int left, int right){
        int mid = (left + right) /2;
        if(left>right) return -1;
        if(num[mid] == target){
            return mid;
        }else if(num[mid] > target){
            return binarySearch(num,target,left,mid-1);
        }else return binarySearch(num,target,mid+1,right);
    }

4.数组元素的排序算法;

明天学。


取[a,b]之间的随机数:

(int)(Math.random()*(b-a+1)+a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值