前言
首先理解数据结构的概念,数据结构是计算机存储、组织数据的方式。相互之间存在一种或多种特定关系的数据元素的集合。选择一种合适的数据结构可以实现更高的运行或存储效率。数据结构往往同高效的检索算法和索引技术有关。数据结构主要研究数据的逻辑结构,划分为:线性结构和非线性结构。常用的数据结构:数组Array、栈Stack、队列Queue、链表Linked List、树Tree、图Graph、堆Heap和散列表Hash等。
下面先介绍数组的基本内容和常见的面试题。
数组概念
1.有序的元素序列,储存多个相同类型数据的集合。2.组成数组的各个变量成为数组的分量,即数组的元素或下标变量。
3.把相同类型的若干元素按无序的形式组织起来。
数组面试题
一、在未排序的整数数组中找到最大值与最小值
使用一层循环,假设第一个数最大或最小 public static void main(String[] args) {
int[] setArray={5,2,1,7,10,56};
int max=setArray[0];
int min=setArray[0];
for (int i = 0; i <setArray.length ; i++) {
if (max<setArray[i]) {
max=setArray[i];
}
if (min>setArray[i]) {
min=setArray[i];
}
}
System.out.println(max+"最大,"+min+"最小");
}
二、请在给出的整数数组中找到重复的数字
1.第一种方法:两层循环/**
* 方法一: 两层循环
*/
public static void test1() {
int[] setArray = {5, 6, 8, 8, 5, 10, 6, 10, 9};
System.out.println("重复的数字如下:");
for (int i = 0; i < setArray.length; i++) {
for (int j = i + 1; j < setArray.length; j++) {
if (setArray[i] == setArray[j]) {
System.out.print(setArray[j] + " ");
}
}
}
}
2 第二种方法 .使用HashMap
/**
* 方法二: HashMap key 存放数字,value 存放出现的次数
*/
public static void test2() {
int[] setArray = {5, 6, 8, 8, 5, 10, 6, 10, 9, 5, 5};
HashMap<Integer, Integer> map = new HashMap<>();
System.out.println("重复的数字如下:");
for (Integer integer : setArray) {
if (map.containsKey(integer)) {
map.put(integer, map.get(integer) + 1);
} else {
map.put(integer, 1);
}
}
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
if ((int) (entry.getValue()) > 1) {
System.out.print(entry.getKey() + " ");
}
}
System.out.println(map.toString());
}
三、找到1到100中丢失的数字
1.第一个方法:两个数组实现,利用桶原理/**
* 1 生成一个指定大小的数组,数字重复
*
* @param size 数组实际大小
* @param capacity 数组容量
*/
private static void test1(int size, int capacity) {
int[] arrayMiss = new int[size];
int[] arrayAll = new int[capacity];
if (size > capacity) {
System.out.println("size 不能大于数组最大容量capacity");
return;
}
/**
* 生成两个数组
*/
System.out.println("生成随机数组");
int randNum;
Random random=new Random();
for (int i = 0; i <= capacity; i++) {
randNum = random.nextInt(capacity);
if (i < size) {
arrayMiss[i] = randNum;
System.out.print(randNum + " ");
}
}
/**
* 将缺失数组的对应数字放到对应的既定数组中
*/
for (int i = 0; i < arrayMiss.length; i++) {
arrayAll[arrayMiss[i]] = arrayMiss[i];
}
System.out.println();
System.out.println("缺失的数字:");
for (int i = 1; i < arrayAll.length; i++) {
if (arrayAll[i] == 0) {
System.out.print(i+" ");
}
}
}
运行结果
2.第二个方法:使用两个Set集合,利用Set无序不重复的特点
public static void test2() {
Set<Integer> setMiss = new HashSet<>();
Set<Integer> setAll = new HashSet<>();
Boolean isContain = false;
int randNum = 0;
Random rand = new Random();
System.out.println("随机数组");
for (int i = 0; i < 100; i++) {
randNum = rand.nextInt(100);
if (randNum != 0) {
setMiss.add(randNum);
}
setAll.add(i + 1);
System.out.print(randNum + " ");
}
System.out.println();
System.out.println("丢失的数字");
for (int num : setAll) {
isContain = setMiss.contains(num);
if (!isContain) {
System.out.print(num + " ");
}
}
}