两道简单的笔试题
来源:互联网 发布:大型无人机价格 知乎 编辑:程序博客网 时间:2024/06/05 13:28
/***********************Update**************************/
第一道题:
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=<a<=b<=len-1
请编写一个程序,找出arr[b]-arr[a]
的最大值。
举例:
输出:0
这个我当时第一感觉就是有点类似最大子数组之和的。不过很明显有一个暴力的
我的解法如下,大家如果找到了
#include <stdio.h>int findMaxDifference(int *arr, int len) { int result=0,temp=0; for(int i=0;i<len;i++) for(int j=i;j<len;j++){ if((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 <cstdio>#include <string.h>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;i<len;i++) src[i-1]=src[i]; src[len-1]=temp;}int print(bool flag1,bool flag2,int L,int R){ if(!flag1 && !flag2) return -1; else return L<R? L : R;}int 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; i<len1;i++){ shiftLeft(s2,len2); leftCount++; if(flag1=ifEqual(s1,s2,len1)) break; } if(leftCount==len1-1 && !flag1); //左移无解 //右移 strcpy(s2,temp); for(int i=0; i<len1;i++){ shiftRight(s2,len2); rightCount++; if(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;}
以上
0 0
- 两道简单的JS笔试题
- 两道简单的笔试题
- 告诉我图样图森破的两道简单C++笔试题
- 两道笔试题
- 两道笔试题
- 两道笔试题
- 百度的两道笔试题
- 百度的两道笔试大题
- 百度的两道笔试编程题
- 由两道笔试题想到的
- C++两道笔试题
- 两道程序员的笔试题求答案!
- 两道大众点评网技术部的笔试题
- 阿里的两道程序笔试题(java)
- [面经]CVTE的两道笔试编程题
- [面经]CVTE的两道笔试编程题
- 两道最近收到某好公司的笔试题。
- 一道简单的笔试题
- xp APPIUM 安装初探
- leetcode5 Longest Palindromic Substring
- 平衡二叉树
- Thinkphp学习笔记(1)
- 最大子段和
- 两道简单的笔试题
- hdu--2191
- MP4 文件格式
- Android 使用AsyncTaskLoader获取手机联系人
- codeforces 556B Case of Fake Numbers
- 全排列hash-康拓展开
- codeforces 556A Case of the Zeros and Ones
- LeetCode----Permutation Sequence
- java中form以post、get方式提交数据中文乱码问题总结