写一个函数找到给定字符串的位置

题目

给你一个排好序的并且穿插有空字符串的字符串数组,写一个函数找到给定字符串的位置。

例子:在字符串数组 [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”,“”, “dad”, “”, “”] 中找到”ball”,返回下标4.

例子:在字符串数组 [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] 中找到”ballcar”,查找失败,返回-1.

解答

字符串数组已经是有序的了,所以,还是可以利用二分查找来找到指定的字符串。 当然了,由于数组中有空字符串,因此还要加些额外的处理,否则无法对比大小。 我们可以这样来处理,如果要对比的那个元素为空字符串,就一直向右移动, 直到字符串不为空或是位置已经超出了high下标。如果位置已经超出high下标, 就在[low, mid-1]这一段查找;如果没有超出high下标,那就和要查找的x进行对比。 相等时返回下标,不等时再根据比较出的大小决定到哪一半去查找。

代码如下:

#include <iostream>
using namespace std;

int search(string s[], int low, int high, string x){
    if(x == "") return -1;
    while(low <= high){
        int mid = (low+high)>>1;
        int t = mid;
        while(s[t] == "" && t <= high) ++t;
        if(t > high) high = mid - 1;
        else{
            if(s[t] == x) return t;
            else if(s[t] < x) low = t + 1;
            else high = mid - 1; //or t-1
        }
    }
    return -1;
}
int main(){
    string s[13] = {
        "at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""
    };
    cout<<search(s, 0, 12, "ball")<<endl;
    return 0;
}

 

时间: 2024-09-20 00:11:24

写一个函数找到给定字符串的位置的相关文章

c c++-写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址

问题描述 写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址 写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址 解决方案 #include ""winsock2.h""#pragma comment(libws2_32.lib"")BOOL CheckIsValidIP(const char* sIP){ unsigned long ulAddress = inet_addr(sIP); if (INADDR_NONE ==

写一个函数对字符串数组排序,使所有变位词都相邻

题目 写一个函数对字符串数组排序,使得所有的变位词都相邻. 解答 首先,要弄清楚什么是变位词.变位词就是组成的字母相同,但顺序不一样的单词. 比如说:live和evil就是一对变位词.OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了.它要求我们在排序的过程中,按照变位词的准则来排序. 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数. 一般情况下我们如果要排序一个长度为n的数组A,我们可以这

php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名

写一个PHP函数,实现扫描并打印出自定目录下(含子目录)的所有jpg文件名的方法 <?php $dir = "E:\照片\\"; //打印文件夹中所有jpg文件 function printJpg($dir,$deep = ""){ $dirSource = dir($dir); while($d = $dirSource->read()){ if($d == "." || $d == ".."){ continu

《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉想到用二进制的位运算.最后写出来是一个迭代的过程. 每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1 然后处理进位问题,相当于计算与运算,得到res2 那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1) 因为res2做左移,总会减小到

[算法] 定义一个函数,删除字符串中所有重复出现的字符。

例如输入google,输出gole 思路: 利用一个hash table用来记录输入字符串中每次字符出现的次数,如果不是0,再复制,如果是1,则跳过.需要新开辟一个数组用来存储新的字符. char * DeleteRepeat(const char *string){ if(string == NULL) return '\0'; int *array = new int[256]; //initilize the array for(int i = 0; i<256; i++){ array[

一家面试公司的机试题,写一个函数,要求输入大于零的整数,返回大写字母序列

问题描述 例如:1返回A 26返回Z27返回AA 53返回BA676返回ZZ 677返回AAA以此类推..咋一看很简单,可越想越复杂感觉,现在头都有些昏了,只好寻求帮助了,谢谢! 问题补充:sandzhang 写道 解决方案 public class Test2{ public static final Integer MODEL_NUMBER = 26; public static char queryString(final int number) { if (number <= MODEL

编写一个函数,转换十进制数为字符串,需要处理负数,为什么会有错误呢

问题描述 编写一个函数,转换十进制数为字符串,需要处理负数,为什么会有错误呢 /* 编写一个函数,转换字符串的逆序字符串,比如"ABC"转换为"CBA".*/void reverse(char r[]int n){ int i; int temp; for(i=0;i<n/2;i++) { temp=r[i]; r[i]=r[n-i-1]; r[n-i-1]=temp; }}void chang1(int a){ int i = 0 j = 0 temp =

《Python数据科学指南》——1.14 返回一个函数

1.14 返回一个函数 在这节里,我们讨论在一个函数里返回另一个函数. 1.14.1 准备工作 我们举一个高中的例子来说明咱们使用返回一个函数的函数.我们要解决的问题是:给定半径,求出不同高度的圆柱体的容积. 请参见:http://www.mathopenref.com/cylindervolume.html. Volume = area height = pi r^2 * h 上面的公式可以准确地求出圆柱体的体积. 1.14.2 操作方法 我们写一个简单的函数来演示在函数中返回函数的概念,此外

c-一般情况下,应该多个函数放一个文件里,还是一个函数放到一个文件里

问题描述 一般情况下,应该多个函数放一个文件里,还是一个函数放到一个文件里 我非科班出身,也从来没读过改内容. 也许是因为书读的不仔细? 解决方案 对于java来说,一个文件一个类(public的类) 多个函数放一个文件里还是一个函数放一个文件里取决于这些函数的相关性.好比你写作文是一句话一个段落还是一个段落好几句话,这个要灵活掌握,老师没法教你. 你去看windows.linux.jdk.mfc等等的源代码,你会发现这个问题根本就不算一个问题. 解决方案二: 我觉得学习应该有3个阶段 模仿 -