前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】24种常见算法题

【数据结构】24种常见算法题

作者头像
陶然同学
发布2023-02-27 12:52:15
1910
发布2023-02-27 12:52:15
举报
文章被收录于专栏:陶然同学博客

补全下面顺序表的插入操作算法代码:

public void insert(int i, Object x) {

//0.1 满校验:存放实际长度 和 数组长度 一样

if(curLen == listEle.length) {

throw new Exception("已满");

}

//0.2 非法校验,在已有的数据中间插入 [0, curLen],必须连续,中间不能空元素

if(i < 0 || i > curLen ) throw new Exception("位置非法");

//1 将i及其之后后移

for(int j = curLen ; j > i; j --) {

listEle[j] = listEle[j-1];

}

//2 插入i处

listEle[i] = x;

//3 记录长度

curLen ++;

}

补全顺序表的删除算法代码

public void remove(int i ) throws Exception {

// 0.1 校验非法数据

if(i < 0 || i > curLen – 1 ) {

throw new Exception("位置非法");

}

// 1 将i之后向前移动

for(int j = i ; j < curLen - 1 ; j ++ ) {

listEle[j] = listEle[j+1];

}

// 2 长度减一

curLen--;

}

补全顺序表的查找算法1代码

循环遍历已有数据,进行判断,如果有返回第一个索引号,如果没有返回-1

public int indexOf(Object x) {

for(int i = 0; i < curLen ; i ++) {

if( listEle[i].equals(x) ) {

return i;

}

}

return -1;

}

补全顺序表的查找算法2代码:

使用变量记录没有匹配到索引

public int indexOf(Object x) {

int j = 0; //用于记录索引信息

while(j < curLen && !listElem[j].equals(x) ) j++;

// j记录索引小于数量

if(j < curLen ) {

return j;

} else {

return -1

}

}

补全单链表长度算法:

public class Node{

public Object data; //数据域

public Node next; //指针域

}

public int length() {

Node p = head.next; // 获得第一个结点

int length = 0; // 定义一个变量记录长度

while(p != null) {

length ++; //计数

p = p.next; //p指向下一个结点

}

return length;

}

补全单链表按索引号(位序号)查找算法代码:

public class Node{

public Object data; //数据域

public Node next; //指针域

}

public Object get(int i) {

Node p = head.next; //获得头结点

int j = 0; //已经处理的结点数

while(p != null && j <i ) { //链表没有下一个 && 处理有效部分

p = p.next;

j++;

}

if(i < 0 || p == null) {

throw new Exception("元素不存在");

}

return p.data; //返回数据

}

补全按值查找索引算法代码:

public class Node{

public Object data; //数据域

public Node next; //指针域

}

//查询给定值的索引号,如果没有返回-1

public int indexOf(Object x) {

Node p = head.next; // 获得头结点

int j = 0; // 不匹配元素的个数

while(p != null && !p.data.equals(x) ) { // 循环依次找【不匹配】元素

p = p.next;

j++;

}

// 返回匹配索引,如果没有返回-1

if(p != null ) {

return j;

} else {

return -1;

}

}

补全入栈算法代码

public class SqStack {

private Object[] stackElem; //栈对象数组

private int top; //长度、下一个存储位置 等

}

public void push(Object x) {

if(top == stackElem.length ) { //栈满

throw new RuntimeException("栈满");

} else {

stackElem[top] = x;

top++;

}

}

1~n求和算法代码补全(n=10)

public class TestSum {

public static void main(String[] args) {

System.out.println(sum(10));

}

private static int sum(int n) {

if(n == 1) {

return 1;

}

return n + sum(n-1);

}

}

n!算法代码补全(n=10)

public class TestFactorial {

public static void main(String[] args) {

System.out.println(factorial(4));

}

private static int factorial(int n) {

if(n == 1 ) {

return 1;

}

return n * factorial(n-1);

}

}

斐波那契数列算法代码补全(n=10)

public class TestFibonacci {

public static void main(String[] args) {

for(int i = 0 ; i <= 10 ; i ++) {

System.out.print(fibonacci(i) + "、");

}

}

private static int fibonacci(int n) {

if(n == 0) return 0;

if(n == 1) return 1;

return fibonacci(n-1) + fibonacci(n-2);

}}

串的扩容算法代码补全

public void allocate(int newCapacity) {

char[] temp = strvalue; // 存放原来的数据 ab数组

strvalue = new char[newCapacity]; // 给strValue重新赋一个更大数组的值

for(int i = 0; i < temp.length; i++) { // 拷贝数据

strvalue[i] = temp[i];

}

}

串的求子串算法代码补全

public IString substring(int begin , int end) {

// 1 两个参数校验

if(begin < 0 || end > curlen || begin > end) {

throw new StringIndexOutOfBoundsException("条件不合法");

}

// 2 优化:当前串直接返回

if(begin == 0 && end == curlen) return this;

// 3 核心算法

char[] buffer = new char[end - begin]; // 构建新数组

for(int i = 0 ; i < buffer.length ; i ++) { // 依次循环遍历新数组,一个一个赋值

buffer[i] = strvalue[i + begin];

}

return new SeqString(buffer); // 使用字符数组构建一个新字符串

}

串删除算法代码补全

public IString delete(int begin , int end) {

// 1 参数校验

if(begin < 0 || end > curlen || begin > end) {

throw new StringIndexOutOfBoundsException("条件不合法");

}

// 2 核心:将后面内容移动到签名

// 2.1 移动

for(int i = 0 ; i < curlen - end ; i ++) {

strvalue[i + begin] = strvalue[i + end];

}

// 2.2 重新统计长度 (end-begin 需要删除串的长度)

curlen = curlen - (end-begin)

return this;

}

n!算法代码补全(n=10):

public class TestFactorial {

public static void main(String[] args) {

System.out.println(factorial(4));

}

private static int factorial(int n) {

if(n == 1 ) { 【代码1】

return 1;

}

return n * factorial(n-1); 【代码2】

}

}

不带监视哨的插入排序算法

public void insertSort() {

RecordNode temp;

int i, j;

for (i = 1; i < this.curlen; i++) {

temp = r[i];

for (j = i - 1; j >= 0 && temp.key.compareTo(r[j].key) < 0; j--) {

r[j + 1] = r[j];

}

r[j + 1] = temp;

display();

}

}

带监视哨的插入排序算法

public void insertSortWithGuard() {

int i, j;

for (i = 1; i <this.curlen; i++) {

r[0] = r[i];

for (j = i - 1; r[0].key.compareTo(r[j].key) < 0; j--) {

r[j + 1] = r[j];

}

r[j + 1] = r[0];

System.out.print("第" + i + "趟: ");

display(9);

}

}

优化版冒泡排序算法

public void bubbleSort() {

RecordNode temp;

boolean flag = true;

for (int i = 1; i < this.curlen && flag; i++) {

flag = false;

for (int j = 0; j < this.curlen - i; j++) {

if (r[j].key.compareTo(r[j + 1].key) > 0) {

temp = r[j];

r[j] = r[j + 1];

r[j + 1] = temp;

flag = true;

}

}

System.out.print("第" + i + "趟: ");

display();

}

}

直接选择排序算法

public void selectSort() {

RecordNode temp;

for (int i = 0; i < this.curlen - 1; i++) {

int min = i;

for (int j = i + 1; j < this.curlen; j++) {

if (r[j].key.compareTo(r[min].key) < 0) {

min = j;

}

}

if (min != i) {

temp = r[i];

r[i] = r[min];

r[min] = temp;

}

}

}

二路归并算法

public void mergepass(RecordNode[] r, RecordNode[] order, int s, int n) {……}//一趟归并算法

public void mergeSort() {

int s = 1;

int n = this.curlen;

RecordNode[] temp = new RecordNode[n];

while (s < n) {

mergepass(r, temp, s, n);

s *= 2;

mergepass(temp, r, s, n);

s *= 2;

}

}

补全带监视哨的顺序查找算法代码

public int seqSearchWithGuard(Comparable key) {

int i = length() - 1;

r[0].key = key;

while(r[i].key.compareTo(key) != 0) {

i--;

}

return i>0 ? i : -1;

}

补全顺序查找代码

public int seqSearch(Comparable key) {

int i = 0 , n = length();

while(i < n && r[i].key.compareTo(key) != 0) {

i++;

}

return i < n ? i : -1

}

补全二分查找算法代码

public int binarySearch(Comparable key) {

if(length() > 0) {

int low = 0, high = length() - 1;

while (low <= high) {

int mid = (low + high) / 2;

if(r[mid].key.compareTo(key) == 0) {

return mid;

} else if (r[mid].key.compareTo(key) > 0) { // 中间值比给定值大

high = mid - 1;

} else {

low = mid + 1;

}

}

}

return -1;

}

补全二叉排序树的递归算法代码

private Object searchBST(BiTreeNode p, Comparable key) {

if (p != null) {

if (key.compareTo(((RecordNode) p.data).key) == 0) {

return p.data;

}

if (key.compareTo(((RecordNode) p.data).key) < 0) {

return searchBST(p.lchild, key);

} else {

return searchBST(p.rchild, key);

}

}

return null;

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档