3.11 程序改错(二分查找)

字符串--java面试题, 首个重复字符串,二分查找 1、题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。 测试样例: "qywyer23tdd",11 返回:y public class FirstRepeat { public char findFirstRe 阅读详情

问题:

找出一个有序(字典序)字符串数组中arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,则返回其中序号最大的。

分析:

二分查找的细节确实很多啊。~~(╯﹏╰)b
我就不实现这个问题了。我主要实现后面几个小题。
给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1。

我自己写的时候,跟书上犯了一模一样的错误…..

int bisearch_findMaxIdx_wrong(int* arr, int b, int e, int key){
    int minIdx = b, maxIdx = e, midIdx;
    while (minIdx < maxIdx){
        midIdx = minIdx + (maxIdx - minIdx) / 2;
        if (arr[midIdx] <= key){
            minIdx = midIdx;
        }
        else{
            maxIdx = midIdx-1;
        }
    }
    if (arr[maxIdx] == key){
        return maxIdx;
    }
    else if (arr[minIdx] == key){
        return midIdx;
    }
    else{
        return -1;
    }

}

在写循环(或者递归)程序的时候,特别要注意:初始条件、转换、终止条件!!!!
我也没有考虑到循环的终止条件有可能无法到达。

测试数据与函数调用:

int arr[] = { 1, 3, 3, 4, 4, 7, 8 };
int idx = bisearch_findMaxIdx1(arr,0,6,3);

当minIdx=1,maxIdx=2
=>midIdx=1,arr[midIdx]<=3
=>minIdx=midIdx=1,maxIdx=2
程序进入了死循环

对于循环结束有两种情况:
1.若minIdx为偶数则minIdx==maxIdx

2.minIdx==maxIdx-1

我们可以将maxIdx=midIdx-1,改为maxIdx=midIdx,这样可以避免出现minIdx==maxIdx。

代码:

//给定一个有序数组,求任意一个i使得arr[i]等于v,不存在则返回-1
int bisearch(int* arr,int b,int e,int key){
    int l = b, r = e,m;
    while (l <= r){
        m = l + (r - l) / 2;
        if (arr[m] == key){
            return m;
        }
        else if (arr[m]>key){
            r = m - 1;  
        }
        else{
            l = m + 1;
        }
    }
    return -1;
}

//找出有序数组中,最大的i使得arr[i]=key,不存在返回-1
int bisearch_findMaxIdx(int* arr,int b,int e,int key){
    int minIdx = b, maxIdx = e, midIdx;
    while (minIdx < maxIdx - 1){
        midIdx = minIdx + (maxIdx - minIdx) / 2;
        if (arr[midIdx] <= key){
            minIdx = midIdx;
        }
        else{
            maxIdx = midIdx;
        }
    }
    if (arr[maxIdx] == key){
        return maxIdx;
    }
    else if (arr[minIdx] == key){
        return midIdx;
    }
    else{
        return -1;
    }

}

//找出有序数组中,最小的i使得arr[i]=key,不存在则返回-1
int bisearch_findMinIdx(int* arr,int b,int e,int key){
    int minIdx = b, maxIdx = e, midIdx;
    while (minIdx < maxIdx - 1){
        midIdx = minIdx + (maxIdx - minIdx) / 2;
        if (arr[midIdx] < key){
            minIdx = midIdx;
        }
        else{
            maxIdx = midIdx;
        }
    }
    if (arr[minIdx] == key){
        return minIdx;
    }
    else if (arr[maxIdx] == key){
        return maxIdx;
    }
    else{
        return -1;
    }
}

//找出有序数组中,最大的i使得arr[i]<key,不存在则返回-1
int bisearch_findMaxIdx1(int* arr,int b,int e,int key){
    int minIdx = b, maxIdx = e, midIdx;
    while (minIdx < maxIdx - 1){
        midIdx = minIdx + (maxIdx - minIdx) / 2;
        if (arr[midIdx] < key){
            minIdx = midIdx;
        }
        else{
            maxIdx = midIdx;
        }
    }
    if (arr[maxIdx] < key){
        return maxIdx;
    }
    else if (arr[minIdx] < key){
        return minIdx;
    }
    else{
        return -1;
    }
}

//找出有序数组中,最小的i使得arr[i]>key,不存在则返回-1
int bisearch_findMinIdx1(int* arr, int b, int e, int key){
    int minIdx = b, maxIdx = e, midIdx;
    while (minIdx < maxIdx - 1){
        midIdx = minIdx + (maxIdx - minIdx) / 2;
        if (arr[midIdx] <= key){
            minIdx = midIdx;
        }
        else{
            maxIdx = midIdx;
        }
    }
    if (arr[minIdx]>key){
        return minIdx;
    }
    else if (arr[maxIdx] > key){
        return maxIdx;
    }
    else{
        return -1;
    }
}
差分式升压逆变器MATLAB仿真模型设计——实现110V/50Hz输出电压与THD<5% 差分式升压逆变器MATLAB仿真设计 摘要 本文提出一种基于差分式升压逆变器(DBI)的MATLAB仿真设计方案,实现80V直流输入转换为110V/50Hz交流输出。该方案采用单级升压逆变拓扑结构,相比传统两级方案具有更高的功率密度和效率。通过建立数学模型,设计SPWM调制策略和电压闭环PI控制,并在MATLAB/Simulink中构建完整仿真模型。仿真结果表明,系统输出电压THD<5%,满足设计要求。文章详细阐述了主电路参数计算、控制策略实现和仿真验证过程,为实际工程应用提供了理论依据和技术参考。 阅读详情

相关推荐

全同态加密:CKKS

不论是 LSB 编码的 BGV,还是 MSB 编码的 BFV,它们的同态运算都是对 $\mathbb Z_t$ 上明文的**精确计算**,因为**密文中的明文空间和噪声空间是分离的**。例如,在 BGV 中是 $te+m$,在 BFV 中是 $\delta m+e$。但是,这种精确计算是在同余意义下的,如果将明文视为实数,那么实际上同态运算时的噪声破坏了明文的 MSB $\lfloor m/t \rfloor$,仅保留了 LSB $[m]_t$,

weixin_44885334的博客 7544

二分查找易错点

算法菜鸟的一些子总结

qq_39913121的博客 229

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3414

二分查找 编程之美3.11 程序改错

3.11 程序改错 这题考察了读者对各种二分查找的的掌握程度,并且还有编码的正确性。 二分查找的原理看似简单,但是如果边界条件没有处理好,极易出现死循环或者得不到正确的答案。 下面总结了编程之美上要求的5种二分查找的代码写法,其中肯定有没有想到的情况,望网友留言指正 1、给定一个有序(不降序)数组arr,求任意一个i,使得arr[i]等于v,不存在则返回-1 int AnyEqu

perfectjob的专栏 814

基于STM32的智能循迹小车设计(基础版)

基于STM32的智能循迹小车设计 硬件准备 1、小车底盘+四直流电机(带轮) 2、STM32F103C8T6核心板 3、12V 8700mAh锂电池(可以用几节18650锂电池) 4、循迹模块 选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用 5、L298N电机驱动模块 四驱车为啥用L298N电机驱动模块? 可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。 12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心

Rendezvous1的博客 3万+

基于Windows环境的OGG远程抽取异常(经典模式)OGG-02830 Formatting error

MOS提供的解决方法,根据MOS的提示是由于使用的OGG版本太新了,经典模式下已经弃用了这种远程抽取方式。问题:Windows环境下启用远程抽取ADG备库的数据,在启动抽取进程的时候出现如下错误提示。

Mrzhou的博客 379

二分查找算法(易错点总结)

文章目录二分的分类·整数二分例题(数的范围):·实数二分例题(数的三次方根)模板总结 二分查找算法,顾名思义就是以中心为分界点对要查找的数进行筛查不断缩小范围,在这我总结了一些模板和我自己在做题中利用二分时有犯的一些错,希望对大家有帮助。 二分的分类 ·整数二分 步骤: 特别注意:如果是利用l=mid来更新范围的话一定要在求mid的时候+1:mid=(l+r+1)/1; 举例:l=5 r=6 如果是直接mid=(l+r)/2的话那么就会陷入死循环(mid=5,l=mid…一直不变),其实就算是l=4 r=

Jacksqh的博客 1158

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

[编程之美] PSet3.11 程序改错:二分查找与扩展

问题描述:         1.对于二分查找中常见

飞扬的青春的专栏 1412

【PyTorch项目实战】之ResNet系列:resnet18、resnet34、resnet50、resnet101、resnet152

ResNet (Residual Network) :是一种深度卷积神经网络(CNN)架构,其核心思想是引入残差学习(Residual Learning)机制,通过跳跃连接(skip connections)来解决深层网络训练中的退化问题。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 6372

cefsharp139-H264-X86升级测试(MP4)-支持PDF预览-chromium7258定制浏览器

CEFSharp 139.x版本升级测试已完成,该版本支持64位系统(需选择x86架构)及WinForms.NETCore(.NET8)。升级内容包括H264文件编译支持Mp4播放,并覆盖WPF、WinForms等平台。文中提供了版本替换方法及不同系统的版本建议(如Win10/11推荐111/133/134/139版)。此外,文章还列举了CEFSharp的多种应用场景,包括浏览器开发、B/S系统封装、资源抓取等,同时指出当前版本均需自行编译以支持MP4播放。详细图文说明及旧版链接已附在正文中。

无线智能模块 可视DIY智能专家 1297

编程之美 3.11程序改错(你会写二分查找吗?)

#include<stdio.h> //求任意一个position使得datas[position]==num,找不到返回-1 intBinarySearch(int*datas,intl,intr,intnum){ intmid,position...

chubi6554的博客 189

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1931

3.11 程序改错

问题: 二分查找的错误代码: int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while(minIndex < maxIndex) { midIndex = (minIndex + maxIndex) / 2;

宁 静 以 致 远 1148

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

读书笔记之编程之美 - 3.11 程序改错

忘了是在哪本书上看的,第一个没有问题的二分查找算法,是经过了很多年的完善才出现的,说明很多大师级的人都无法一次写出这样的程序。 关于溢出的问题之前已经有所了解,算是一个基本技巧吧。而边界问题要仔细设计用例才能保证没有问题。 本来想写扩展问题的,可是不知道链表的长度,另外可能需要再保存一个多余的链表,也很麻烦,这个问题先不做了,上网看了看资料,还有什么追赶算法,了解一下为止。

山高月小 1921

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

编程之美3-11程序改错

二分查找你针对有序序列而言的一种查找算法,关于二分查找有一下的几类问题: 1. 给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1#include <iostream> using namespace std; int binarySearch(int A[], int left, int right, int t) { int m; while

zkj126521的博客 353

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

编程之美:第三章 结构之法 3.11程序改错

/* 程序改错: 找出一个有序字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这样的条件,则返回其中序号最大的 程序中的错误: 1 midIndex = (minIndex + maxIndex)/2;这样可能会由于求和中间结果而溢出,应该改为midIndex = minIndex + (maxIndex - minIndex)/2; 2 循环的终止条件可能无法达到,比如minIn

qingyuanluofeng的专栏 850

编程之美,3.11程序改错, 二分扩展

#include using namespace std; int find1(int *a, int start, int end, int b) {//给定一个有序序列a,求任意一个i使得a[i]等于b,不存在返回-1. int mid; while(start<=end){ mid = start + (end-start)/2; if(a[mid]<b){ star

sen_lin8350的专栏 528

无处不在的二分查找

引入 什么是二分查找? 先来一个简单的游戏,我选定了1-100之间的某个数,你来猜。50?太大了。25?太小了。如此,游戏进行下去,直到你猜中为止。这样,对区间为1-n之间的整数,你可以在log(n)次之内猜中。 在某一给定范围内,查找某个对象,每次查找可以判断该对象与相应位置值的关系。二分查找通过查找当前范围的中间位置来定位,这样每次查找之后,查找的范围都会变为原来的一半。二分查找其实

ClockWiser的专栏 671

2015年c语言等级考试题1 10 2分,2015年3月二级C语言新增无纸化真考题库试卷(1)

一、选择题(每小题1分,共40分)1、有以下程序:程序运行后的输出结果是( )。A.1,2,6,24,120,B.1,2,3,4,5,C.1,1,1,1,1,D.1,2,4,6,8,2、下列叙述中正确的是( )。A.软件是程序、数据和文档B.软件是程序和数据C.软件是算法和数据结构D.软件是算法和程序3、语句prinff(”%d\n”,strlen(”\t\”\、、n\"\065\08AB”));...

weixin_39964833的博客 165

第3章 结构之法

3.1 字符串移位包含的问题 s1=AABCD  s2=CDAA s2可以通过s1移位来包含。 对于这个问题:我的思路是,在s1中遍历第一个字母,若找到第一个,则以CD  然后AAB的方式遍历s1而以顺序的方式遍历s2即可,这种方式应该效率比较高。 3.2电话号码对应英语单词 3.3 计算字符串的相似度 对于两个字符串,可以坐增加、修改、删除字符操作,每操作一次,距离加上1,那

hang on it more longer 550

2017国二c语言考试试卷,2017备考计算机二级C语言真题试卷

在不断的练习中更总结出考试出题规律,是练习的意义所在。下面是小编整理的2015年3月计算机二级C语言真题试卷,欢迎使用!一、选择题(每小题1分,共40分)1、有以下程序:程序运行后的输出结果是( )。A.1,2,6,24,120,B.1,2,3,4,5,C.1,1,1,1,1,D.1,2,4,6,8,2、下列叙述中正确的是( )。A.软件是程序、数据和文档B.软件是程序和数据C.软件是算法和数据结...

weixin_34338129的博客 462

Day 11:Java 冒泡排序、选择排序、二分查找

键盘录入 5 个整数存入数组并打印。

weixin_43746297的博客 443

2008级c语言复习题,华中科技大学2008级C语言程序设计复习提纲.doc

C语言程序设计复习提纲题型与分数分布单项选择题(每小题1分,共10分)例:0618是( D )A、字符型常量 B、整型常量 C、浮点型常量 D、非法常量多项选择题(每小题2分,共10分)例:设有说明:int a=1,b=3,c=0;下面表达式的值为1(对于逻辑表达式代表非0)的有( B、C、D )。A、++a+c B、(b>a)&&(a&gt...

weixin_42588672的博客 168
上一篇: 3.10 分层遍历二叉树
下一篇: Linux命令简单总结
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值