1. 一维数组的声明和初始化
数组可以看成是多个相同类型数据组合,对这些数据的统一管理。
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
2. 数组元素的引用
注意这里的length是属性,String里的length是方法
public static void main(String[] args){}主函数和普通函数类似,也有参数,这里args[]这个String类型的数组就是main函数的参数。
对数组进行排序:选择、冒泡…
对数组进行查找:二分…
数3退1
package com.array;
/***
* 500个人围成一圈,从第一个开始数1,每个输到3的人退出,下一个人再开始从一开始数。
*用布尔类型数组进行标记,true表示还在圈内
*/
public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500]; //boolean默认false
for (int i = 0; i < 500; i++) {
arr[i] = true;
}
int leftCount = arr.length;
int countNum = 0;
int index = 0;
while(leftCount > 1) { //剩余的人大于1,游戏继续
if(arr[index] == true) {
countNum++;
if(countNum == 3) { //数到3时 此人退出,剩余人数减少,下一个人从
arr[index] = false;
leftCount--;
countNum = 0;
}
}
index++; //500个人挨个遍历
if(index == arr.length) {
index = 0;
}
}
for(int i = 0; i < 500; i++) {
if(arr[i] == true) {
System.out.println(i);
}
}
}
}
/*
* 435
*/
数3退1另一种方法(面向对象思维+双向回环链表)
package com.array;
/***
* 500个人围成一圈,从第一个开始数1,每个输到3的人退出,下一个人再开始从一开始数。
*把每个人和圈都看成对象,新来的人左手拉住最后一位的右手,右手拉住第一位的左手
*/
public class Count3Quit {
public static void main(String[] args) {
KidCircle kc = new KidCircle(500);
int countNum = 0;
Kid k = kc.first;
while(kc.count>1) {
countNum++; //报数
if(countNum == 3) {
countNum = 0;
kc.remove(k);
}
k = k.right; //下一位
}
System.out.print(kc.first.id);
}
}
class Kid {
int id;
Kid left;
Kid right;
}
class KidCircle {
int count = 0;
Kid first,last;
KidCircle(int n){
for(int i = 0;i < n; i++) {
add();
}
}
void add() {
Kid k = new Kid();
k.id = count;
//圈内只有一人时
if(count <= 0) {
first = k;
last = k;
k.left = k;
k.right = k;
}else {
last.right = k;
k.right = first;
k.left = last;
first.left = k;
last = k;
}
count++;
}
void remove(Kid k) {
if(count <= 0) {
return;
}else if (count == 1) {
first = last =null;
}else {
k.left.right = k.right;
k.right.left = k.left;
}
//删除的是首节点或尾节点需要特殊考虑
if(k == first) {
first = k.right;
}else if (k == last) {
last = k.left;
}
count--;
}
}
/**
* 435
*/
3. 二维数组的声明和使用
4. 数组拷贝
5. 总结
数组(引用类型)的内存布局
常见算法