careercup-排序和查找 11.5

11.5 有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置。

解法:

如果没有那些空字符串,就可以直接使用二分查找法。比较待查找字符串str和数组的中间元素,然后继续搜索下去。针对数组中散布一些空字符串的情形,我们可以对二分查找法稍作修改,所需的修改就是mid进行比较的地方,如果mid为空字符串,就将mid换到离它最近的非空字符串的位置。

C++实现代码:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int searchR(vector<string> &str,int left,int right,string s)
{
    if(left>right)
        return -1;
    int mid=(left+right)/2;
    if(str[mid].empty())
    {
        int l=mid-1;
        int r=mid+1;
        while(1)
        {
            if(l<left&&r>right)
                return -1;
            if(l>=left&&!str[l].empty())
            {
                mid=l;
                break;
            }
            if(r<=right&&!str[r].empty())
            {
                mid=r;
                break;
            }
            l--;
            r++;
        }
    }
    if(str[mid]==s)
        return mid;
    else if(s<str[mid])
        return searchR(str,left,mid-1,s);
    else
        return searchR(str,mid+1,right,s);
}

int search(vector<string> &str,string s)
{
    return searchR(str,0,str.size()-1,s);
}

int main()
{
    vector<string> vec= {"","abc","","hfh","jhfh","kdhf","","sss","zzz",""};
    cout<<search(vec,string("zzz"))<<endl;
}
时间: 2024-10-11 15:51:44

careercup-排序和查找 11.5的相关文章

leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)

题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this affect the run-time complexity? How and why? Write a function to determine if a given target is in the array. 说明: 1)和1比只是有重复的数字,整体仍采用二分查找 2)方法二 : 实现:  

java 数组比较,元素的比较,Comparable,Comparator比较的应用实现,排序,查找示例

java 数组比较,元素的比较,自定义Comparator的实现,排序,查找示例 package org.rui.array.compar; import java.util.Arrays; import java.util.Random; import org.rui.generics.anonymity.Generator; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,

leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)

题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no du

常用排序,查找,树算法集锦

本文转载至  http://blog.csdn.net/zhangkongzhongyun/article/details/8080466 分类: c语言2012-10-17 11:16 275人阅读 评论(0) 收藏 举报 算法google 前面写了好些排序,红黑树,B 树算法的文章,还剩下查找这一大块没有写,查找相关的算法代码已经实现,但是却没有写查找算法日志的闲情了,只好先在这里放出代码来,以后有空有闲情再补上吧. 算法代码 Google 仓库:点击这里 已完成算法 排序 插入排序 希尔排

计算机程序设计艺术+第3卷:排序与查找(第二版)pdf

下载地址:网盘下载 第3卷的头一次修订对经典计算机排序和查找技术做了最全面的考察.它扩充了第1卷对数据结构的处理,以将大小数据库和内外存储器一并考虑:遴选了精心核验的计算机方法,并对其效率做了定量分析.第3卷的突出特点是对"最优排序"一节的修订和对排列论与通用散列法的讨论. Donald.E.Knuth(唐纳德.E.克努特,中文名高德纳)是算法和程序设计技术的先驱者,是计算机排版系统TEX和METAFONT的发明者,他因这些成就和大量创造性的影响深远的著作(19部书和160篇论文)而誉

Python数据结构与算法—排序和查找

排序和查找 排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列. 常见排序方法: 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 1 # 冒泡 2 def bubble(list_): 3 # 外层循环表达比较多少轮 4 for i in range(len(list_) - 1): 5 #内层循环把控比较次数 6 for j in r

所有的排序、查找算法

import javax.mail.Part; /** * 顺序查找.排序 * * @author 曾修建 * @version 创建时间:2014-7-30 下午04:15:10 */ public class SequentialSearch { public static void main(String[] args) { Integer[] a = {1,2,3,4,5,7,6,88}; //二分查找非递归 System.out.println( "二分查找非递归实现 位置 : &qu

链表排序,查找,洗牌,旋转

链表的排序和查找可以使用Collections类 排序,public static sort(List<E> list1)不实现Comparable的结点不能用 查找,int binarySearch(List<E> list2,T Key,CompareTo<T>) 都是第一个放链表对象,第二个放结点 结点要实现接口Comparable接口的compareTo方法作为比较标准,后面的参数可以写null (比如Sring内部已经实现了compareTo方法,就是按照字典

排序和查找算法的使用

TBOX提供了各种常用算法,对容器中的元素进行各种操作,这里主要介绍下排序和查找算法. 排序算法目前支持如下几种: 快速排序:tb_quick_sort 堆排序: tb_heap_sort 插入排序:tb_bubble_sort 冒泡排序:tb_insert_sort 并且提供通用的tb_sort接口,对各种排序算法进行自动适配,使得任何情况下,性能都是最优的. 例如: 对具有随机迭代特性的容器,采用库快速排序来优化 对具有随机迭代特性,并且是超大规模的容器,采用堆排序 对只能线性迭代的容器采用

使用qsort()和bsearch()函数对值和字符串进行排序和查找

#include <stdio.h> #include <stdlib.h> #define MAX 20 int intcmp(const void *v1, const void *v2); int main(void){   int arr[MAX], count, key, *ptr;      //提示用户输入一些整数    printf("Enter %d integer values; press Enter each.\n", MAX);   f