/***********************Update**************************/
第一道题: O(N) 的解法:
int findMaxDifference_2(int *arr,int len){
int num=0;
for(int i=0;i<len;i++)
if(arr[i+1]-arr[i]>0 && arr[i+1]-arr[i]>num)
num=arr[i+1]-arr[i];
return num;
}
今天做了一个公司的笔试题,不过其实第二道我之前在编程之美上就看到过,不过考试时没写出来。第一道题如下:
有一个数组arr,长度为len;现有a,b。0= 请编写一个程序,找出
arr[b]-arr[a]
的最大值。
举例:
#include
int findMaxDifference(int *arr, int len) {
int result=0,temp=0;
for(int i=0;ifor(int j=i;jif((temp=arr[j]-arr[i])>0 && temp > result)
result = temp;
}
return result;
}
int main(int argc,char **argv){
int arr[3]={10,5};
printf("The MaxDifference is : %d\n",findMaxDifference(arr,2));
}
第二个问题:
现有两个字符串s1 s2。有2种操作:左移,右移。
左移:将字符串第一个字符移到最后
右移:将字符串最后一个字符移动到第一位
举例:
s1 = "abcd"
s2 = "bcda"
则s2右移一位之后便于s1相等。如果是左移,则需要:
cdab->dabc->abcd
三次运算
问题就是:给定两个字符串,求最少移动多少次可使得两个字符串相等。如果不能找到一个解,返回-1
虽然之前看过了,不过第一眼看到时以为这是一个动态规划求最优解。后来一分析:虽然题意上说有左移和右移两种选择,可能有人会以为先左移,再右移这样可能会出现最优解。仔细一想你就发现,实际上只有两个选择:循环左移,循环右移。
到这里,就可以写代码了。当然,还有第二种以时间换空间的解,不过你看编程之美去吧。我有空可能会写。
#include
#include
int ifEqual(char *s1,char *s2,int len){
for(int i=0;i != len ; i++)
if(s1[i]!=s2[i])
return 0;
return 1;
}
void shiftRight(char *src,int len){
char temp=src[len-1];
for(int i=len-2;i>=0;i--)
src[i+1]=src[i];
src[0]=temp;
}
void shiftLeft(char *src,int len){
char temp=*src;
for(int i=1;i1]=src[i];
src[len-1]=temp;
}
int print(bool flag1,bool flag2,int L,int R){
if(!flag1 && !flag2)
return -1;
else
return Lint distance(char *s1, char *s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
char temp[len1+1];
bool flag1=false,flag2=false;
strcpy(temp,s2);
if(len1 != len2)
return -1;
int leftCount=0,rightCount=0;
//左移
for(int i=0; iif(flag1=ifEqual(s1,s2,len1))
break;
}
if(leftCount==len1-1 && !flag1); //左移无解
//右移
strcpy(s2,temp);
for(int i=0; iif(flag2=ifEqual(s1,s2,len1))
break;
}
if(rightCount==len1-1 && !flag2); //右移无解
//return
return print(flag1,flag2,leftCount,rightCount);
}
int main(int argc,char **argv){
char s1[]="abcd";
char s2[]="bdaa";
int result=distance(s1,s2);
printf("result:%d\n",result);
return 0;
}
以上