算法编程(四)

一、给定一个整数序列,请获取最小(最大)的K个数字

    这个题还算比较熟悉,在大数据计算时,经常会遇到类似于“Top N”的情况,这个题的解法有很多种,本例还是采用惯例做法:创建一个K大小的容器,容器内的数字都是排序的;在遍历输入序列时,如果遇到比容器内最大值还要大的数字时,则将容器中的最小值移除,即容器中保留K个“已经遇见”的最大数字。在java中,我们直接使用TreeSet作为容器,当然你也可以自己构建一个红黑数。

    代码样例:

public static TreeSet<Integer> find(int[] source,int k) {
    TreeSet<Integer> top = new TreeSet<>();
    for(int i= 0; i< source.length; i++) {
        int item = source[i];
        if(top.isEmpty() || top.size() < k) {
            top.add(item);
            continue;
        }

        if(top.last() > item) {
            top.add(item);
            top.pollLast();//移除最后一个
        }
    }
    return top;
}

 

二、给定一个整数数组序列,请计算出“连续子数组”和值的最大值,数组中正负值都有,无序

    描述:输入一个数组,这个数组中有正、负整数组成,求数组中“连续的几个元素”的和值的最大值;比如原始数组为{1,-2,3,10,-4,7,2,-5},其中{3,10,-4,7,2}这个子数组的和值最大,为18。

 

    这个题其实并不复杂,认识到判断时机就可以突破了。

数组:1,-2,3,10,-4,7,2,-5

1)
初始最大值为,max = 1,即数组的第一个元素。
2)
1,-2和值为-1,因为-1比max小,继续。
3)
-1,3和值为-2,此时我们就需要做中断了,因为-2比当前元素3的值还要小,
因此我们可以断定,前面的“子数组”的计算是无效的
(只要它参与计算,只会降低总和);
所以此时,我们将3作为新子数组的开始,max = 3,继续遍历。
4)
遍历时,如果和值比当前max大,则替换max。
直到数组的结尾!

 

    代码样例:

private static int maxSum(int[] source) {
    if(source.length == 0) {
        throw new RuntimeException("Empty array!");
    }

    int max = source[0];
    int length = source.length;
    int current = max;
    for (int i = 1 ; i < length; i++) {
        current = source[i] + current;
        if (current <= source[i]) {
            max = source[i];
            current = max;
            continue;
        }
        if(current > max) {
            max = current;
        }
    }
    return max;
}

 

三、给定一个字符数组,请获得此数组中重复出现次数最多的字符元素(字符元素一定有重复)

    这个题,其实很简单,如果你钻了牛角尖,估计就比较麻烦:比如你尝试使用逐个遍历比较的方式!我们已知的字符是有限的,我们可以使用Map来保存每个字符以及其出现的次数,这样就很容易得到答案,Map的key为字符值,value为其出现的次数。

    代码样例:

public static char maxTimes(char[] sources) {
    if(sources.length == 0) {
        throw new RuntimeException("Empty array!");
    }
    int maxTimes = 1;
    char result = sources[0];
    Map<Character,Integer> container = new HashMap<>();
    for(int i = 0;i < sources.length; i++) {
        char item = sources[i];
        if(container.containsKey(item)) {
            Integer times = container.get(item);
            times++;
            if(times > maxTimes) {
                maxTimes = times;
                result = item;
            }
            container.put(item,times++);
        }else {
            container.put(item,1);
        }
    }
    return result;
}

 

    题目的变种可以为:

    给定1亿个数字,它们被保存在文件中,请你找出出现次数最多的哪个数字!

    思路为分治法,将数组取模并分散存储在多个小文件中,确保相同的数字被转存在相同的文件中,然后逐个计算每个文件中出现次数最多的数字,然后取次数最多的那个即可。

 

四、有两个单向链表,它们在某个节点开始,后续节点都重合,请你用程序找出首个重合点。

    比如如下两个链表:

    1-->2-->3-->4-->5-->6-->7

    7-->10->5-->6-->7

    我们看出,5是这两个链表的首个重合点。要实现这个算法,用粗暴的方式逐个遍历复杂度太高,当然实现起来简单。我们在上述几个题目都已经表示,对于单向链表,从后遍历或者查找,最好的办法就是借助辅助栈,这个题目我们也这么做。

    用两个辅助栈分表保存链表的节点,然后同时逐个弹出,并比较栈顶的值,直到第一个不相同的节点出现为止。代码样例如下:

public static Node joinPoint(LinkedNodes first,LinkedNodes second) {
    if(first == null || second == null) {
        return null;
    }
    Node  firstRoot = first.header.next;
    Node secondRoot = second.header.next;
    if(firstRoot == null || secondRoot == null) {
        return null;
    }
    //借助辅助栈,将单向链表反序
    Stack<Node> data1 = new Stack<>();
    Stack<Node> data2 = new Stack<>();
    while (true) {
        Node item = firstRoot.next;
        if(item == null) {
            break;
        }
        data1.push(item);
    }

    while (true) {
        Node item = secondRoot.next;
        if(item == null) {
            break;
        }
        data2.push(item);
    }

    //依次弹出栈,并比较,最后一个相同点就是join点
    Node result = null;
    while (true) {
        Node n1 = data1.pop();
        Node n2 = data2.pop();
        if(n1.value != n2.value) {
            break;
        }else {
            result = n1;//or n2;
        }
    }
    return result;
}

 

五、求一个二叉树的最大深度

    二叉树的树深,就是root节点到最底层叶子节点的最大距离。很简单,递归实现;代码样例如下:

public static int depth(BinaryTreeNode node) {
    if(node == null) {
        return 0;
    }
    BinaryTreeNode left = node.left;
    int l = 0;
    if(left != null) {
        l = depth(left);
    }
    BinaryTreeNode right = node.right;
    int r = 0;
    if(right != null) {
        r = depth(right);
    }
    return l > r ? l + 1 : r + 1;
}

 

【花雕学编程】Arduino FOC 之四轴SCARA机器人正逆解算法 涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。 阅读详情

相关推荐

1.4 《SST通用技术规范》整体框架与核心条款解读

本小节以**GB/T《电力电子变压器通用技术要求》**(固态变压器SST核心通用规范)为核心依据,结合电力电子变压器技术特性与工程应用边界,系统解析规范的整体章节框架、层级逻辑与强制性/推荐性核心条款,明确规范与传统工频变压器标准的差异,为SST拓扑设计、性能验证、出厂检验与工程落地提供标准化依据。全文以标准原文、期刊文献数据与试验规范为支撑,无主观推演与感性表述。

技术工作者 1685

【花雕学编程】Arduino PID 之四轴无人机姿态算法

在电机控制中,PID 可以根据目标速度和实际速度的偏差来调整电机的驱动信号,实现稳定的转速控制。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、机器人运动控制:在机器人技术中,基于速度闭环的PID控制可以用于电机的速度调节,实现精确的运动控制,提高机器人的灵活性和稳定性。4、风扇和泵控制:在风扇和水泵等设备中,PID控制能够根据需求自动调节转速,提供适合的流量和风速,提高系统的能效。

雕爷学编程 1249

离线安装samba与配置(.tar方式安装)

个人记录

小道士写程序 7722

编程中十大常用算法:(四)KMP算法

背景 字符串匹配问题: (1)有一个字符串str1=“BBC ABCDAB ABCDABCDABDE”,和一个子串str2=“ABCDABD” (2)现在要判断str1中是否含有str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1 暴力匹配算法: 利用暴力匹配算法,假设现在str1匹配到i位置,子串str2匹配到j位置,则有: 1)如果当前字符串匹配成功(即str1[i]=str[j]),则i++,j++,继续匹配下一个字符 2)如果匹配失败(即str1[i]!=str[j]),则i=i-(j-

z437490133的博客 708

深入解析Matlab phantom函数:从基础模体到自定义头部仿真

本文深入解析了Matlab中的phantom函数,它是医学图像处理算法测试的核心工具。文章详细介绍了如何使用内置的Shepp-Logan及其改良版头部仿真模体,并重点讲解了通过自定义参数矩阵来构建专属模体的方法。通过从生成模体到模拟投影(正弦图)再到图像重建的完整实战流程,展示了phantom函数在CT等算法开发与验证中的关键作用。

m3n5b7v8c9x的博客 950

RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析

本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。

weixin_29161719的博客 166

educoder机器学习-实验四-编程实现基于信息增益进行划分选择的决策树算法

这是educoder平台,机器学习-实验四-编程实现基于信息增益进行划分选择的决策树算法的代码详解与解决过程详解,创造不易,请大家点点赞,收藏藏!

m0_64351669的博客 2066

IPv6之001-IPv6是什么

技术本质:IPv6(Internet Protocol version 6)是互联网工程任务组(IETF)设计的网络层核心协议,用于替代IPv4核心使命:解决IPv4地址枯竭问题,重构互联网基础架构,支撑万物互联时代革命性特征fill:#333;color:#333;color:#333;fill:none;IPv6128位地址空间无状态自动配置原生IPsec加密协议头部精简。

老韩的Linux云计算架构师进阶之路 1392

cuda编程_CUDA编程入门(四)并行归约算法

这一篇我们一起学习一下如何使用CUDA实现并行归约算法。首先我们要知道什么是并行归约。并行归约(Reduction)是一种很基础的并行算法,简单来说,我们有N个输入数据,使用一个符合结合律的二元操作符作用其上,最终生成1个结果。这个二元操作符可以是求和、取最大、取最小、平方、逻辑与或等等。我们以求和为例,假设输入如下:int array[8] = [3, 1, 7, 0, 4, 1, 6, 3]...

weixin_39517054的博客 423

YOLO26改进策略【YOLO和Mamba】| CVPR 2025:EfficientViM 压缩隐藏状态空间进行通道混合、单头设计减少内存操作,提升目标检测效率与精度

本文记录的是利用模块优化的目标检测网络模型。EfficientViM Block(基于隐藏状态混合器的状态空间对偶性模块) 的设计旨在,提升特征提取效率,同时兼顾全局依赖捕捉与局部细节保留。本文将深入研究的原理,并将其应用到中,通过重构特征提取流程、减少内存绑定操作、融合多阶段特征,增强模型在资源受限环境下的检测性能与速度。EfficientViM: Efficient Vision Mamba with Hidden State Mixer based State Space DualityEfficie

Limiiiing的博客 399

2026 最新安全 Skill 合集(CTF / 审计 / 渗透 / 红队)威胁建模一网打尽

2026年安全领域进入"Skill化"时代,各类安全能力被结构化封装为可复用的AI Skill。本文介绍了7个核心安全Skill项目:渗透测试全流程的AgentSkillsHub、CTF解题技能库ctfskills、多语言代码审计工具codeaudit、PHP专项审计系统、Java自动化审计流水线、威胁建模工具threatmodeling以及覆盖30+领域的Anthropic-Cybersecurity-Skills。这些项目将传统安全经验转化为标准化、可验证、可自动执行的模块化能力,支

Chengbei11的博客 1876

C#编程之经典算法——查找(四)

斐波那契查找(Fibonacci search)       原理与折半查找是一样的。只不过是通过斐波那契数列来划分查找区域的。示例代码/// /// 斐波那契查找/// /// 递增的有序数组/// 查询的元素/// 返回元素在数组中索引。如果数组中无此元素则返回-1int Search4(char[] cArr, char c){ int

yyhian的专栏 777

华为ONU远程登录管理配置

华为P602E、EG8040CONU、EG8240H5、W626E等ONU、ONT默认无法配置管理IP,无法远程telnet登录管理。校园网项目中因故障诊断需要远程登录ONU可以通过OLT的远程WEB代理功能链接登录,具体配置如下:

symstandsun的博客 6109

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式,而算法是解决问题的方法和步骤。你要挑战的蓝桥杯,实际也是在设计算法解决问题。其实各种编程语言都只是工具,而程序的核心=数据结构+算法。犹如练武,数据结构和算法是内功,各种编程语言都只是刀枪棍棒,根据需要在不同的场合选用顺手的兵器。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 900

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算思维核心四步法:从分解、抽象到算法,打通编程与AI学习路径

计算思维是一种运用计算机科学基本概念进行问题求解、系统设计和人类行为理解的思维过程,它超越了单纯的编程技能,是一种普适性的元能力。其核心原理建立在四大支柱之上:分解、模式识别、抽象和算法设计。掌握计算思维的技术价值在于,它能提供一套可迁移的问题解决框架,是高效进行软件开发、系统设计以及理解人工智能工作原理的基础。在应用场景上,无论是设计一个学生成绩管理系统,还是构建具备智能联想功能的通讯录程序,计算思维都能指导开发者从复杂需求中提炼出清晰的数据模型和可执行的算法步骤。例如,在人工智能领域,大语言模型的训练本

weixin_30784501的博客 363

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

<br />直接插入排序(straight insertion sort)<br /> <br />      直接插入排序的作法是: <br />  每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 <br />  第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 <br />  直接插入排序属于稳定的排序,时间复杂性为o(n^2),

yyhian的专栏 1476

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构编程算法(四)

1.随机数 2.矩阵的相关操作 3.字符串比大小 4.矩阵的转置 5.时间的比较 6.构造与撤销 有关C++书上习题十的若干问题

XLYcmy的博客 489

计算机网络原理——实验四编程实现路由算法

北京交通大学计算机网络原理——实验四编程实现路由算法

hzzzhzzzh的博客 567

ADSP-21569的图形化编程专题四:基础算法-音效算法

ADSP-21569的基础音效算法应该怎么去写,看本篇,写了15个例程。

ADI_OP的博客 1019

【花雕学编程】Arduino BLDC 之四足机器人步态协调控制算法

本文介绍了一种基于Arduino和BLDC电机的四足机器人步态协调控制算法。系统采用无刷伺服电机作为关节执行器,通过相位振荡器、逆运动学和状态机等算法实现多自由度协同控制。文章详细解析了系统特点(包括高动态响应、闭环控制和实时同步要求)、应用场景(如教育实验、仿生研究等)及注意事项(硬件选型、性能优化和安全调试)。提供了对角步态和动态小跑步态的代码实现示例,展示了如何通过PID控制和相位差协调实现稳定行走。该系统适合作为中高阶机器人开发平台,但需注意Arduino的性能限制和BLDC驱动的复杂度。

雕爷学编程 1299

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

解法:二分查找本题主要考察对二分查找的理解程度,在一次二分查找中,我们需要清楚的知道我们要查找的是以左端点为主还是以右端点为主的,二者在代码上也会存在一些差别。public:// 先找左端点//left可以不用重置// 再找右端点。

m0_74099572的博客 817

【花雕学编程】Arduino PID 之使用MPU6050和GYML8511的四轴无人机控制算法

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。Arduino的特点是: 1、开放源码:Arduino的硬件和软件都是开

雕爷学编程 1256

C算法编程题(四)上三角

前言   上一篇《C算法编程题(三)画表格》   上几篇说的都是根据要求输出一些字符、图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点。 程序描述   方阵的主对角线之上称为“上三角”。    请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。    例如:当...

weixin_33758863的博客 427

python编程篇之数据结构与算法(四)

栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In...

peterblackas的博客 178
上一篇: 算法编程(三)
下一篇: 算法编程(五)
iteye_19607
博客等级 码龄8年 34粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值