算法编程(三)

基于matlab的捷联惯导算法编程(三) (二)捷联惯导算法主程序 1.整体代码 %捷联惯导算法仿真主程序 clear clc format long gvar; %加载全局变量 nn=2; %子样数,采用二样子圆锥误差补偿算法 ts=0.01; %单个采样间隔的采样时间长度 nts=nn*ts; %采样周期,在nts时间内进行两次采样,每次采样 0.1秒 %输入姿态角向量att含三个分量,依次为俯仰角θ(Theta),横滚角γ(Gama),航向角ψ(Fai) att=[-1.42701;0.569073;-176.015]*arc 阅读详情

一、请使用栈,设计一个数据结构,它具有栈的“先进后出”的特性,同时还可以获取栈中的最小值,要求此数据结构的pop、push、min方法的复杂度均为O(1)

    这个题,最大的问题就在min方法上,如果不使用其他的辅助数据结构,是无法满足min方法的设计要求,即使使用一个临时变量保存当前的最小值(这种情况下,如果最小是被pop,就断片了。。)。所以我们的注意力就集中在:怎们能让一个栈是有序的?其实让栈内数据有序,使用排序的思路肯定是不行的,但是我们能够维持“最小值”的连续性就可以。看看如下的设计思路:

使用2个栈来设计这个数据结构,分别为数据栈和辅助栈
数据栈用来保存push的数据
辅助栈用来保存“最小值”的连续性:

栈底<--------->栈顶
1)添加3
数据栈:3
辅助栈:3,3为最小值
2)添加4
数据栈: 3 4
辅助栈: 3 3
因为4 > 3,为了保持“最小值”连续性,我们在4对应的辅助栈的位置上仍然添加3。
3)添加2
数据栈: 3 4 2
辅助栈: 3 3 2
因为3 > 2,最小值变了,所以讲新的最小值入栈。

如上所述,那么min方法,只需要从辅助栈中peek栈顶的元素值就行了。
当数据栈中pop元素时,也将辅助栈中对应位置的元素移除。

 

    代码样例如下:

static class MinStack {
    Stack<Integer> data = new Stack<>();
    Stack<Integer> helper = new Stack<>();

    synchronized void push(Integer value) {
        data.push(value);
        int min = value;
        if(!helper.isEmpty()) {
            int current = helper.peek();
            if(current <= value) {
                min = current;
            }
        }
        helper.push(min);
    }

    Integer min() {
        if(helper.isEmpty()) {
            return null;
        }
        return helper.peek();
    }

    synchronized void pop() {
        if(data.isEmpty()) {
            return;
        }
        data.pop();
        helper.pop();
    }
}

    

二、请编写一个算法用于判定:序列B为序列A作为栈时可能的弹出顺序(A中的数字不会重复)

    听到题目,第一感觉就是:听不懂!

    先描述一下:假如有序列A为[1,2,3,4,5],它作为栈时由1开始依次入栈,序列B为[5,4,3,2,1]是A作为栈时的一个弹出顺序。但是序列A在没有完全入栈时也可以弹出,比如[1,2,3,4]先入栈,然后弹出4,然后再将5入栈,那么其弹出序列就是[4,5,3,2,1]。因为A入栈和出栈的时机可以任意,所以它的出栈序列可能会有多种,请你判定一个给定的序列是否为A的一个出栈顺序。

    实话说,看到这个题,我也没有思路...如下为分析过程,突破口就是要用一个辅助栈来保存A。

将A保存在数据栈,B使用一个辅助栈
A:1 2 3 4 5
B:4 5 3 2 1 (假设序列)

1)
遍历A和B,以B作为判断基准
2)
在B中第一个元素为4,因为A中1、2、3均不等于4,直到遇到4
则将它们都添加到数据栈
数据栈: 1 2 3 
3)此时A与B都遇到4,我们认为是一次弹出(或者同时入栈,然后弹出)
4)B继续遍历,此时为5
判断,5是否与数据栈的栈顶一样,如果不一样,则遍历A的下一个元素。
5)此时A与B都遇到5,我们认为是一次弹出。
6)A序列遍历结束,只能根据数据栈作为判定。
7)B继续遍历,此时为3,从数据栈中弹出栈顶,比较是否也为3,如果是继续
8)重复7,直到不相等(返回false)或者数据栈全部弹出(返回true)。

 

    解题思路总结:从B中确定弹出元素,比如a,如果辅助栈的栈顶刚还是a,则弹出,否则遍历A序列找到a,在a之前的元素全部添加到辅助栈中;如果所有的元素都查找完仍没有找到a,则认为判读失败。

 

    代码样例:

public static void main(String[] args) {
    int[] source = {1,2,3,4,5};
    int[] target = {3,5,4,2,1};
    System.out.println(check(source,target));
}

public static boolean check(int[] source,int[] target) {
    if(source.length == 0 || target.length == 0) {
        return false;
    }
    if(source.length != target.length) {
        return false;
    }
    int length = source.length;
    Stack<Integer> data = new Stack<>();
    int di = 0;//数据序列的索引位置
    for(int i = 0; i < length; i ++) {
        int item = target[i];
        //入栈完毕
        if(di == length) {
            if(data.isEmpty()) {
                return false;
            }
            int top = data.pop();
            if(top == item) {
                continue;
            }else {
                return false;
            }
        }
        while (di < length) {
            int current = source[di];
            if(item == current) {
                di++;
                break;
            } else if(data.isEmpty()){
                data.push(current);
                di++;
            } else {
                int top = data.peek();
                if(top == item) {
                    data.pop();
                    break;
                }else {
                    data.push(current);
                    di++;
                }
            }
        }
    }
    return true;
}

 

三、使用广度优先的方式遍历二叉树,并逐层打印节点值

    广度优先,就是按照二叉树的level,逐级遍历。如果你有过此方面的算法经验,其实这个题非常简单。如果你喜欢钻牛角尖,估计这题不好办!钻牛角尖的思路就是:递归、遍历、数组等等。

    推演思路:

假如输入二叉树,树的结构如下:
           8
          /\
      6        10
     /\        /\
    5  7      9  11

当前节点          队列
8               6,10
6               10,5,7
10              5,7,9,11
5               7,9,11
7               9,11
9               11
11              空

要求打印结果:8 6 10 5 7 9 11

 

    突破口已经有了,就是使用一个队列来保存即将参与打印的节点。太有才了,此后大家需要记住,广度遍历二叉树时要使用队列!!代码样例如下:

static class BinaryTree {
    BinaryTreeNode root;
}
static class BinaryTreeNode {
    BinaryTreeNode left;
    BinaryTreeNode right;
    int value;
}

public static void print(BinaryTree tree) {
    if(tree == null) {
        return;
    }
    BinaryTreeNode root = tree.root;
    if(root == null) {
        return;
    }
    Queue<BinaryTreeNode> data = new LinkedList<>();
    data.add(root);
    while (!data.isEmpty()) {
        BinaryTreeNode current = data.poll();
        System.out.print(current.value + ",");
        BinaryTreeNode left = current.left;
        if(left != null) {
            data.add(left);
        }
        BinaryTreeNode right = current.right;
        if(right != null) {
            data.add(right);
        }
    }
}

 

    我们还需要简单考虑一下,如果打印结果的要求是“逐层”?

比如上述二叉树,打印结果为:
8
6 10
5 7 9 11

 

    此时我们发现一个队列其实无法满足设计需要,我们需要用两个队列:

1)
队列1     队列二
8            空
空           6 10

2)
队列1      队列二
空           6 10
5 7          10
5 7 9 11   空

基本思路就是,在将其中一个队列出队的时候,将其
子节点添加到另一个队列的尾部,且每次都将当前队列
完全出队,此后再以同样的方式操作另一个队列。

 

    代码样例:

public static void print(BinaryTree tree) {
    if(tree == null) {
        return;
    }
    BinaryTreeNode root = tree.root;
    if(root == null) {
        return;
    }
    Queue<BinaryTreeNode> first = new LinkedList<>();
    Queue<BinaryTreeNode> second = new LinkedList<>();
    first.add(root);
    while (true) {
        if(first.isEmpty() && second.isEmpty()) {
            break;
        }
        if(first.isEmpty()) {
            inner(first,second);
        }else {
            inner(second,first);
        }
    }

}
private static void inner(Queue<BinaryTreeNode> first,Queue<BinaryTreeNode> second) {
    while (!second.isEmpty()) {
        BinaryTreeNode current = second.poll();
        System.out.print(current.value + ",");
        BinaryTreeNode left = current.left;
        if(left != null) {
            first.add(left);
        }
        BinaryTreeNode right = current.right;
        if(right != null) {
            first.add(right);
        }
    }
    System.out.println();
}

 

四、输入一个整数数组,判断该数组是否为某二叉搜索树的后序遍历结果

    我们首先分析一下二叉树后序遍历结果的特点,比如{5,7,6,9,11,10,8}是一个正常的二叉树后序遍历结果;最后一个元素一定是root节点,即为8;从数组的一个元素开始,首次遇到的比8大的元素之前的元素列表都是8的左子树,其他的为右子树,比如{5,7,6}为左子树,{9,11,10}为右子树。当然每个子树也是“后序遍历”的结果,比如对于左子树,6就是其根节点,5是其左节点,7是有节点。这种比较的合法性是可传递的,即任何节点的左子树元素都应该小于它的值,右子树的元素都大于它的值。(无重复元素)

 

    比如输入{7,4,6,5},判断这个序列是否为后序遍历结果;由此得知:5是跟节点,{7,4,6}是它的右子树,但是其中4小于5,不符合判定规则,因此判断结果为false。

 

    代码样例:

public static boolean check(int[] source,int start,int end) {
    if(start == end) {
        return true;
    }
    int root = source[end];
    int i = start;
    //判断左子树的位置
    for(;i < end; i++) {
        if(source[i] > root) {
            break;
        }
    }
    int j = i;
    for(;j < end - 1;j++) {
        if(source[j] < root ) {
            return false;
        }
    }
    boolean left = true;
    if(i > 0) {
        left = check(source, start, i - 1);
    }

    if(!left) {
       return false;
    }
    boolean right = true;
    if (i < end - 1) {
        right = check(source, i, end - 1);
    }
    return left && right;
}

 

Java笔试面试题三(编程算法) 一、字符串相关操作 String s = " Hello java,hello android,hello OOP,HELLO String,hello JAVASE!";System.out.println("原始字符串:" + s);// 原始字符串: Hello java,hello android,hello OOP,HELLO String,hello JAVASE!S 阅读详情

相关推荐

笔试编程算法题笔记(三 C++代码)

题意简单来说就是,在一个无穷大的棋盘上,不断插入k个皇后,皇后们如果在 同一行,同一列,在一个45°主对角线 在一个135°副对角线上,就可以互相攻击。我们需要判断在第i个皇后插入后,是否存在互相攻击的情况。解法:哈希表。我们只需要将皇后的攻击范围存入哈希表(unordered_set)中,每次插入时判断这个皇后是否在这个攻击范围内即可。因此我们需要创建四个哈希表。对应的行 列,两个对角线。行和列很好理解,关于对角线比如主对角线,如果y - x相等,说明在同一个主对角线上。

m0_74099572的博客 949

并行计算 结构.算法.编程一书一个问题的思考

陈国良院士的《并行计算 结构.算法.编程》一书第3.2.3节,公式3.14下面一段话的意思,其实指的是当G(p)>p时,Sun-Ni的加速比随p增大的速度高于Amadahl和Gustafson定律,如下图所示: 在考虑存储的一般化情况下: 1)对于Amdahl定律,G(p)=1时,即存储容量增大到p倍时,计算量不变,因此增大存储容量没有意义,因此其加速比随并行节点数p变化如图中曲线a...

cloudeagle_bupt的专栏 1021

并行计算——结构·算法·编程习题答案

并行计算——结构·算法·编程习题答案 并行计算——结构·算法·编程习题答案 并行计算——结构·算法·编程习题答案 并行计算——结构·算法·编程习题答案 并行计算——结构·算法·编程习题答案

编程基本算法(三)

 编程基本算法(一) 编程基本算法(二) 编程基本算法(三) 选择排序 使用条件:可对比大小的集合。 算法思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17} //简单选择排序void Si...

dkenp04020的专栏 107

计算机理论基础完全版答案

计算机理论基础的答案 全部都有,里面都是图片,其他

并行计算——结构·算法·编程 习题答案

这是并行计算——结构·算法·编程的部分习题答案,请看清楚再下

Java面试宝典——算法与编程(三)

二.算法与编程 1、编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件中,a.txt 文件中的单词用回车符分隔,b.txt 文件中用回车或空格进行分隔。 答: packagecn.itcast; import java.io.File; import java.io.FileReader; import java.io.FileWrite...

南山浪子的专栏 567

[并行计算——结构·算法·编程].陈国良.文字版

并行计算 陈国良编著 呵呵 大家来下载 是第三版《并行计算:结构•算法•编程(第3版)》是并行计算系列丛书之开篇,它以并行计算为主题,围绕并行计算机、并行算法和并行程序设计展开讨论,强调融并行计算机体系结构、数值与非数值并行算法设计以及并行程序设计为一体,着力构建并行计算“结构-算法-编程-应用”完整的学科体系与系统的课程框架,在着重讨论并行计算学科基础核心内容的同时,也力图反映本学科的新近成就和发展趋势

实验三:手动编程实现K-means算法

实验三:手动编程实现K-means算法 K-均值算法(K-means)算法概述: k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小

m0_46303002的博客 1424

Super4PCS文章阅读笔记

Super4PCS阅读笔记 Super4PCS阅读笔记 前言 前言 今天给大家分享一下点云配准四点法4PCS0的变种——Super4PCS。此算法的原文在:Super4PCS: Fast Global Pointcloud Registration via Smart Indexing。稍微我也会写一篇关于如何使用这篇文章的里所提供的代码进行点云粗配准。关于四点法...

Vodake的博客 4539

NoUnityCN:绕过地域限制,从Unity官方CDN直链下载全版本编辑器

在软件开发和游戏制作领域,内容分发网络(CDN)是保障全球用户高速、稳定获取大型文件的核心基础设施。其原理是通过将资源缓存至遍布各地的边缘节点,使用户能从地理距离最近的服务器获取数据,从而显著提升下载速度并降低源站压力。这一技术对于需要频繁下载大型开发工具(如游戏引擎)的团队而言,价值在于能确保开发环境部署的一致性与效率,是构建自动化CI/CD流水线和团队协作的基础。然而,当开发者因网络策略或地域限制无法直接访问官方CDN时,获取安装文件便成为阻碍工作流的痛点。NoUnityCN项目正是针对此场景的工程实践

weixin_33473110的博客 313

编程中十大常用算法:(三)动态规划算法

理论介绍 动态规划(Dynamic Programming, DP)算法的核心思想为:讲大问题划分成小问题进行解决,从而一步步获取最优解的处理算法。 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治算法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是相互独立的(即下一子阶段的求解是建立在上一子阶段的解的基础之上,进行进一步的求解)。动态规划算法可以通过填表的方式来逐步推进,得到最优解。 实际问题:背包问题 问题

z437490133的博客 935

AI产品经理面试宝典第9天:关于AI产品经理的挑战与转型怎么回答

AI技术重构产品逻辑,AI产品经理需直面三大核心命题:用户定位差异、技术融合边界、商业价值转化。本文从千道真题中提炼出面试高频考点,剖析AI产品经理如何突破传统思维定式,在B端需求与C端体验间构建价值桥梁,用数据驱动产品创新,破解技术落地的隐性壁垒。掌握这三重跃迁法则,助你在AI浪潮中脱颖而出。

打造全国最全的AI Agent开发知识领域的博客 175

C#编程之经典算法——排序(三)

<br />快速排序(Quicksort)<br />      <br />      快速排序是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。<br />      设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后

yyhian的专栏 669

openbmc mctp i3c适配步骤

本文介绍了在Intel OKS平台下,BMC作为I3C从设备如何适配MCTP over I3C的实现方法。主要内容包括:1)关键术语解释,如MDB(Mandatory Data Byte)值为0xAE,DCR(Device Characteristics Register)和BCR(Bus Characteristics Register)的设置;2)适配流程说明,包括BMC作为控制器主节点分配地址后成为MCTP端点,CPU作为总线所有者的角色转换;3)测试验证步骤,展示通过mctp-client工具发送指

wit_yuan的专栏 132

把 ABAP Smart Form 输出变成可直接下载的 PDF 二进制:OTF 到 XSTRING 的一条龙实践

SAP Smart Forms 生成 PDF 的实用方案:通过 OTF 格式转换实现高效输出。Smart Forms 本身不直接生成 PDF,而是输出 OTF 格式数据,需通过 CONVERT_OTF 函数转换。本文提供两种实现路径:传统的 Spool 方式和更优的直接获取 OTF 方式,后者避免了 Spool 的维护负担。核心代码演示了如何通过设置 GETOTF 参数获取 OTF 数据,并转换为 PDF 二进制流,适用于前端下载、接口传输等场景。同时介绍了 SSF_OPEN/SSF_CLOSE 方法用于批

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 675

C#编程之经典算法——递归过程(三)

八皇后问题           八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发

yyhian的专栏 478

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4171

编程笔记(三) 二分查找算法

二分查找的基本介绍

m0_51153423的博客 310

基于深度学习的灰度图像气泡群识别与优化

灰度图像气泡群深度学习识别优化研究 本研究针对MATLAB实现的深度学习气泡群识别系统在从1445个点到4992个点扩展时出现的精度不稳定问题,提出了一套完整的解决方案。文章首先分析了问题根源,包括数据复杂度增加、类别不平衡、网络容量不足等因素,然后系统性地提出了数据预处理增强、网络架构优化、训练策略调整和后处理算法改进等优化措施。通过改进的U-Net架构、自适应直方图均衡化等技术创新,有效提升了模型在大规模气泡群图像上的识别精度和稳定性,为化工、生物医学等领域的灰度图像分析提供了可靠的技术支持。

max500600的博客 412

数学向量空间的对偶空间解析

对偶空间是线性代数的"进阶语法",它不仅深化了我们对向量空间的理解,还为解决实际问题提供了强大工具。用生活类比解释对偶空间的核心概念,打破"抽象数学"的壁垒;建立对偶空间与原向量空间的直观联系,揭示"对偶"的本质;通过数学推导和代码实现,让读者掌握对偶空间的基本运算;展示对偶空间在科学和工程中的应用,体现其理论价值。范围:本文从有限维实向量空间入手(便于理解),逐步扩展到对偶基、双对偶空间,最后简要提及无限维空间的特殊性。

AI天才研究院 879

第三届全国大学生算法设计与编程挑战赛个人银首——>金奖

⭐️话说每次都是周末一大早开始比赛到下午两点吗,前一晚偷偷玩了会儿晚睡了,本来罚时令我与金擦肩而过的QAQ ⭐️但11月2号下午看到查重后的获奖名单,检索自己的名字,赫然变成了金奖hh,看来有同学不老实被查重除名了,这波属于被动补位 ⭐️这次个人赛属实打的有点捞,团队赛拿了rank9,可惜没拿到季军(真的想要奖牌啊啊啊啊!),只能下个赛季再努力啦!.........

米莱虾 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2025“钉耙编程”中国大学生算法设计暑期联赛(3)1004三带一

题目考察二分查找应用,关键在于设计check函数。通过计算每种牌需要组成3张的下限t,判断是否满足条件(t≤min(arr[i]/3,x)且总和≤x)。算法时间复杂度为O(13log(sum/4)),使用二分查找确定最大可行解。AC代码实现了这一思路,先预处理牌数总和,再通过二分查找验证中间值。

2301_80100359的博客 295

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 算法编程(二)
下一篇: 算法编程(四)
shift_alt_ctrl
博客等级 码龄10年 0粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值