9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置

/**

* 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置。

*/

	/**
	 * 思路:对二分查找法做修改,与mid比较的地方,如果mid为空字符串,则将mid换到离它最近的非空字符串的位置。
	 * @param strings
	 * @param str
	 * @return
	 */
	public static int search(String[] strings,String str){
		if(strings==null||str==null||str=="")
			return -1;
		return searchStr(strings,str,0,strings.length);
	}

	public static int searchStr(String[] strings,String str,int first,int last){
		if(first>last)
			return -1;

		int mid=(first+last)/2;
		//若mid为空字符串,找出离它最近的非空字符串
		if(strings[mid].isEmpty()){
			int left=mid-1;
			int right=mid+1;
			while(true){
				if(left<first&&right>last)
					return -1;
				else if(right<last&&!strings[right].isEmpty()){
					mid=right;
					break;
				}else if(left>first&&!strings[left].isEmpty()){
					mid=left;
					break;
				}
				left--;
				right++;
			}
		}

		if(str.equals(strings[mid]))
			return mid;
		else if(strings[mid].compareTo(str)<0)
			return searchStr(strings, str, mid+1, last);//搜索右半边
		else
			return searchStr(strings, str, first, mid-1);//搜索左半边
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 05:40:50

9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置的相关文章

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

二分法变体,当查找到mid元素是空串时,同时向两边扩散寻找不为空串的索引作为mid,继续执行二分. public class Solution { public int search(String[] list, String str) { if (list == null || list.length == 0 || str == null || str.isEmpty()) return -1; return searchHelper(list, str, 0, list.length -

c程序设计 8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工

8.15写几个函数:①输个职工的姓名和职工号:②按职工号由小到大顺序排序,姓名顺序也随之调整:③要求输入一个职工号,用折半法找出该职工的姓名, 从主函数输入要查找的职工号,输出该职工. 写的时候为方便输入,我设的是输入3名职工的信息. #define N 3 #include <stdio.h> #define N 3 #define LEN 20 //定义一个结构体类型 struct student{ char name[LEN]; int num; }; int main(){ int n

(算法:二分查找)在排序数组中,找出给定数字出现的次数

题目: 在排序数组中,找出给定数字出现的次数 思路: 既然出现排序数组,很容易想到二分查找,时间复杂度为O(logn): 先通过二分查找找到最左边出现该数字的下标left(如果没找到,则返回-1),然后通过二分查找找到最右边出现该数字的下表right(如果没找到,则返回-1),然后right-left+1就是出现的次数: 代码: #include <iostream> using namespace std; int BinarySearchCount(int *array,int len,i

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

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

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

排序与查找简单算法 java代码实现

最近整理了下以前的资料.有的算法没有实现,嘿嘿,以后再补吧! /** * 排序算法的分类如下:      * 1.插入排序(直接插入排序.折半插入排序.希尔排序):      * 2.交换排序(冒泡泡排序.快速排序):      * 3.选择排序(直接选择排序.堆排序):      * 4.归并排序:      *  关于排序方法的选择:      * (1)若n较小(如n≤50),可采用直接插入或直接选择排序.      *  当记录规模较小时,直接插入排序较好:否则因为直接选择移动的记录数少

Leetcode34---&gt;Search for a Range(在排序数组中找出给定值出现的范围)

题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, 8, 10] and target value 8,return [3, 4]. 解题思路: 一看到题目要求的时间复杂度O(logn),就自然想要要用到二分的方法,这道题目,我们自然也是用二分的方法: mid = (start + end) / 2;则target和nums[mid]的关系有三种:

最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现

首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串.比如:上海自来水来自海上,bob等等. 那么什么又是找出最长回文串呢? 例如:字符串abcdefedcfggggggfc,其中efe,defed,cdefedc,gg,ggg,gggg,ggggg,gggggg,fggggggf,cfggggggfc都是回文串,左右完全一样. 这其中,有最短的gg,最长的cfggggggfc,还有其他长度的.忽略长度为1的.毕竟一个字符的都算回文了. 那么,找出最长的,就是找出这个cf

9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置

/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置. */ 两种方法: 方法一: /** * 思路:套用排序算法,并修改比较器.这里比较器用来指示两个字符串胡伟变位词就是相等的. * @param array */ public static void sort(String[] array){ Arrays.sort(array, new AnagramComparator()); } class AnagramComparator implements Comparator