9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. Write a method to merge B into A in sorted order.

A has enough buffer at the end to hold B, we can merge two arrays from end to start index, like merge two arrays in merge sort algorithm.

void mergeTwoArray(int A[],int m,int B[],int n){

int k=m+n-1;

m--;n--;

while(m>=0&&n>=0){

if(A[m]>=B[n])A[k--]=A[m--];

else A[k--]=B[n--];

}

while(m>=0)A[k--]=A[m--];

while(n>=0)A[k--]=B[n--];

}

9.2 Write a method to sort an array of strings so that all the anagrams are next to each other.

Based on basic sort function, we define a cmp function to decide how to sort. Here, we compare theirs anagrams' state.

int cmp(string s1,string s2){

sort(s1.begin(),s1.end());

sort(s2.begin(),s2.end());

if(s1<s2)return 1;

else return 0;

}

void sortStrings(vector<string> &strs){

sort(strs.begin(),strs.end(),cmp);

}

**9.3 Given a sorted array of n integers that has been rotated an unknown number of times, give an O(log n) algorithm that finds an element in the array. You may assume that the array was originally sorted in increasing order.

EXAMPLE:

Input: find 5 in array (15 16 19 20 25 1 3 4 5 7 10 14)

Output: 8 (the index of 5 in the array)

like binary search, we declare left/mid/right variables to represent current array part, because the array is rotated, we will have 8 states as following: k is the goal data.

k<a[mid],k<a[left],k<a[right], in this condition, right=mid-1 || left=mid+1, for we cannot make sure which part including rotated part.

k<a[mid],k<a[left],k>a[right], in this condition, left=mid+1;

k<a[mid],k>a[left],k<a[right], in this condition, right=mid-1;

k<a[mid],k>a[left],k>a[right], in this condition, right = mid-1;

k>a[mid],k<a[left],k<a[right], in this condition, left=mid+1;

k>a[mid],k<a[left],k>a[right], in this condition, right=mid-1;

k>a[mid],k>a[left],k<a[right], in this condition, left=mid+1;

k>a[mid],k>a[left],k>a[right], in this condition, left=mid+1 || right=mid-1;

  1. int findIndex(int a[],int left,int right,int k){
  2. if(left>right)return -1;
  3. int mid=left+(right-left)/2;
  4. if(k==a[mid])return mid;
  5. else if(k==a[left])return left;
  6. else if(k==a[right])return right;
  7. else if(k<a[mid]){
  8. if(k<a[left]){
  9. if(k<a[right]){
  10. int temp=findIndex(a,left,mid-1,k);
  11. if(temp!=-1)return temp;
  12. return findIndex(a,mid+1,right,k);
  13. }else{
  14. return findIndex(a,mid+1,right,k);
  15. }
  16. }else if(k>a[left]){
  17. return findIndex(a,left,mid-1,k);
  18. }
  19. }else if(k>a[mid]){
  20. if(k>right){
  21. if(k>left){
  22. int temp=findIndex(a,left,mid-1,k);
  23. if(temp!=-1)return temp;
  24. return findIndex(a,mid+1,right,k);
  25. }else{
  26. return findIndex(a,left,mid-1,k);
  27. }
  28. }else{
  29. return findIndex(a,mid+1,right,k);
  30. }
  31. }
  32. return -1;
  33. }
  34. int search(int A[], int n, int target) {
  35. return findIndex(A,0,n-1,target);
  36. }

Method2: not only compare target with a[left/mid/right], we compare a[left]/a[mid]/a[right] to decide which part has rotated part.

k<mid,left<mid,k<left, in this condition, left=mid+1

k<mid,left<mid,k>left, in this condition, right=mid-1

k<mid,left>mid, in this condition, right=mid-1

k>mid,left<mid, in this condition, left=mid+1

k>mid,left>mid,k>right, in this condition, right=mid-1

k>mid,left>mid,k<right, in this condition, left=mid+1

int search(int A[],int n,int target){

int left=0,right=n-1,mid;

while(left<=right){

mid=left+(right-left)/2;

if(A[mid]==target)return mid;

else if(target<A[mid]){

if(A[left]<=A[mid]){

if(target<A[left])left=mid+1;

else right=mid-1;

}else right=mid-1;

}else{

if(A[left]>A[mid]){

if(target<=A[right])left=mid+1;

else right=mid-1;

}else left=mid+1;

}

}

return -1;

}

9.4 If you have a 2 GB file with one string per line, which sorting algorithm would you use to sort the file and why?

external sort. Divide to N parts, sort each part, then N-way merge.

9.5 Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.

Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”, “dad”, “”, “”] will return 4

Example: find “ballcar” in [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] will return -1

we do it based on binary search, first, we traverse the front part and the back part to make true left index and right index pointing to a no-empty string. Then we find mid index, if strs[mid]=="", we traverse mid to right
then to left to find the first no-empty string, this index is the mid index and do it like binary search.

int searchStrs(vector<string> strs,string target){

if(target==""||strs.size()==0)return -1;

int left=0,right=strs.size()-1,mid;

while(left<=right){

while(strs[left]==""&&left<right)left++;

while(strs[right]==""&&right>left)right--;

mid=left+(right-left)/2;

if(strs[left]==target)return left;

if(strs[right]==target)return right;

if(strs[mid]==""){

for(int i=mid+1;i<right;i++){if(strs[i]!="")break;}

if(i!=right)mid=i;

else{

for(int i=mid-1;i>left;i--){if(strs[i]!="")break;}

if(i!=left)mid=i

else return -1;

}

}

if(strs[mid]==target)return mid;

else if(strs[mid]<target)left=mid+1;

else if(strs[mid]>target)right=mid-1;

}

}

return -1;

}

9.6 Given a matrix in which each row and each column is sorted, write a method to find an element in it.

the matrix is sorted in rows and columns, let's assume it is a m*n matrix, we begin at matrix[0][n-1], if target< current, we move down, if target>current, we move left, if(target ==current) we find it, if we move out
of the matrix, the element isn't in it.

time complexity is O(n+m).

int rowAndColumn(vector<vector<int> > matrix,int target){

int m=matrix.size();if(m==0)return -1;

int n=matrix[0].size();if(n==0)return -1;

int x=0,y=n-1;

while(x<m&&y>=0){

if(matrix[x][y]==target)return x*n+y;

else if(matrix[x][y]>target)y--;

else if(matrix[x][y]<target)x++;

}

return -1;

}

9.7 A circus is designing a tower routine consisting of people standing atop one another’s shoulders. For practical and aesthetic reasons, each person must be both shorter and lighter than the person below him or her. Given the
heights and weights of each person in the circus, write a method to compute the largest possible number of people in such a tower.

EXAMPLE:

Input (ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)

Output: The longest tower is length 6 and includes from top to bottom: (56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)

we first sort all people by their height, then find the longest ascending sequence of their wight.

struct People{

int height;

int weight;

};

int cmp(People* p1,People* p2){

if(p1->height<p2->height)return 1;

else return 0;

}

int largestNum(vector<People*> peos){

if(peos.size()==0)return 0;

sort(peos.begin(),peos.end(),cmp);

int *f = new int[peos.size()];

int maxNum=0;

for(int i=0;i<peos.size();i++){

f[i]=1;

for(int j=0;j<i;j++){

if(peos[j]->weight<peos[i]->weight){

f[i]=max(f[i],f[j]+1);

}

}

maxNum=(maxNum>f[i]?maxNum:f[i]);

}

return maxNum;

}

CareerCup Chapter 9 Sorting and Searching的更多相关文章

  1. Algorithm in Practice - Sorting and Searching

    Algorithm in Practice Author: Zhong-Liang Xiang Date: Aug. 1st, 2017 不完整, 部分排序和查询算法, 需添加. Prerequisi ...

  2. 20162314 Experiment 3 - Sorting and Searching

    Experiment report of Besti course:<Program Design & Data Structures> Class: 1623 Student N ...

  3. Chp11: Sorting and Searching

    Common Sorting Algo: Bubble Sort: Runime: O(n2) average and worst case. Memory: O(1). void BubbleSor ...

  4. [Java in NetBeans] Lesson 15. Sorting and Searching.

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: Build in functions in java.util.Collections Need to implement a co ...

  5. Careercup | Chapter 1

    1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...

  6. Careercup | Chapter 3

    3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...

  7. Careercup | Chapter 2

    链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...

  8. Careercup | Chapter 8

    8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...

  9. Careercup | Chapter 7

    7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...

随机推荐

  1. mongodb权威指南读书笔记

    一个服务器能不能运行多个不同端口的mongo实例? 如果两个对象不相等,hashcode一定不相等:如果两个对象相等,hashcode相等或者不相等? 修改器速度42页 update({},{&quo ...

  2. PHP Math

    PHP Math 简介 Math 函数能处理 integer 和 float 范围内的值. 安装 PHP Math 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP 5 Math 函 ...

  3. jquery 获取 outerHtml 包含当前节点本身的代码

    在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到. 看到有的人通过pare ...

  4. phpEXCEL操作全解

    phpExcel中文帮助手册,列举了各种属性,以及常用的操作方法,难得是每一个都用实例加以说明,希望对大家有所帮助. phpExcel中文帮助手册,不可多得的好文章,供大家学习参考. 1.设置exce ...

  5. python笔记——第二天

    早上6:40起床,睡眼惺忪,学学代码提提神.学完了条件语句. input函数输入值为字符串,处理前转化为int()或float()或其他. if else elif 注意书写格式,否则容易出现synt ...

  6. UI、ID、UE和GUI,这些都是什么

    在网页和应用设计领域中,我们经常会听到人们用这些英文缩写描述设计工作,那么它们各自代表什么含义?具体的工作.方向和区别是什么呢? 下面让我们先来看看它们的英文全称和基本概念. UI(User Inte ...

  7. STL之优先队列(priority_queue)

    转自网上大牛博客,原文地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对 ...

  8. AE-模板替换->愉快今日--视频样片!

  9. DbUtility-查询DataTable

    直接上源码 using System; using System.Data; using System.Threading.Tasks; using DbUtility; namespace Test ...

  10. Android 给TextView添加点击事件

    首先设定TextView的clickable属性为true. 可以在布局文件中进行设定,比如: <TextView android:id="@+id/phone" andro ...