本博客的《面试题目搜集系列不错》
(1)面试题目搜集1
(2)面试题目搜集2
(3)面试题目搜集3
(4)面试题目搜集4
(5)面试题目搜集5
(6)面试题目搜集6
1.字符串取除多余的空格,包括行首的空格,单词与单词之间只能有多余的空格,结尾不能有空格。
例如:“ i am lsj ” ==》“i am lsj”
#include<iostream>
#include<cctype>
using namespace std;
void deleteSpace(char* str)
{
char*ptr = str;
bool flag = true;
while(isspace(*str++));//去除字符串开始的空格
--str;
while(*str){
if(isalpha(*str)){
if(ptr!= str)//防止同一个空间赋值
*ptr++= *str;
flag= true;//当前字母不是空格
}
else{
if(flag){
*ptr++= *str;
flag= false;
}
}
str++;
}
ptr--;//ptr已经被加1了,特别注意
if(isspace(*ptr))//去除结尾的空格
*ptr= '\0';
else
*++ptr= '\0';
};
int main()
{
char str[]=" i am lsj ";
//这里不能定义,这样定义"i am lsj"就是在字符串常量区分配空间
//即不能对str进行操作,在deleteSpace中也不能通过ptr赋值了
//系统编译报错
//char* str=" i am lsj ";
cout<<str<<endl;
deleteSpace(str);
cout<<str<<":The end"<<endl;
system("pause");
return 0;
}
2.二分查找
int binarySearch(int arr[],int low,int high,int target)
{
while(low<=high){
//注:这句话不能写成int mid =low +(high-low)>>1;
//因为“+”的优先级比“>>”要高
//可以这样写int mid = low+(high-low>>1);
int mid = low +((high-low)>>1);
if(arr[mid]>target)high= mid -1;
else if(arr[mid]<target)low = mid + 1;
else return mid;
}
return -1;
}
3.问题定义:给定一个整数数组arr,数组中元素的个数是n,数组arr已经排好序,要在arr中找到某个某个整数x出现的次数,比如arr[]= {1,2,2,3,5,10},找到2的出现次数就是2。
问题分析:相必看到有序数组的字样,想到利用二分应该是很顺利成章的事了。我们可以利用二分搜索求出x在arr中出现的第一个位置lo和最后一个位置hi,然后计算hi-lo+1的值就是x在arr出现的次数了,当然也有可能x并没有在arr中出现过,这时hi和lo都等于-1。时间复杂度是两个二分的复杂度:2*O(log n)。看看代码是怎么实现的吧!!
#include<iostream>
#include<cctype>
using namespace std;
int binarySearchUpper(int arr[],int low,int high,int target)
{
if(low>high)return -1;
while(low<=high){
int mid = low +(high-low>>1);
//包含等于,继续搜索
if(arr[mid]<=target)low= mid + 1;
else high = mid - 1;
}
//这里返回low的话,表示恰好大于该数的第一个数,在求LIS用到
if(arr[high]==target)return high;
else return -1;
}
int binarySearchLower(int arr[],int low,int high,int target)
{
if(low>high)return -1;
while(low<=high){
int mid = low +(high-low>>1);
//包含等于,继续搜索
if(arr[mid]>=target)high = mid - 1;
else low = mid + 1;
}
if(arr[low]==target)return low;
else return -1;
}
void count(int *arr,int begin,int end,int target)
{
int hi = binarySearchUpper(arr,begin,end,target);
int lo = binarySearchLower(arr,begin,end,target);
if(hi != -1)
{
cout<<target<<"在数组中出现了"<<hi- lo +1 <<"次!"<<endl;
}
else
{
cout<<target<<" 在数组中出现了 0 次!!"<<endl;
}
}
int main()
{
int arr[] = {2,3,3,3,4,6};
count(arr,0,5,5);
system("pause");
return 0;
}
说明:寻找上限的时候,在等于target的时候不能停止搜索,要继续往上搜;而在寻找下限的时候,等于target的时候不能停止搜索,要继续往下搜。
4.编写一个C语言程序判断一个系统还是大端还是小端系统;请写一段程序,判断操作系统是32位还是64位(不允许使用sizoof)?
#include<cstdio>
int main()
{
int i_num=0x12345678;
printf("[0]:0x%x\n",*((char*)&i_num+0));
printf("[1]:0x%x\n",*((char*)&i_num+1));
printf("[2]:0x%x\n",*((char*)&i_num+2));
printf("[3]:0x%x\n",*((char*)&i_num+3));
getchar();
return 0;
}
注:网络字节序说是大端字节序。 比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放
#include <stdio.h>
int main(void)
{
int i = 0x80000000;
if(i<0){
printf("i = %d\n", i);
printf("32 bits.\n");
}else{
printf("i = %d\n", i);
printf("64 bits.\n");
}
return 0;
}
5.整数数组arr已经排好序,其中包含正数,0负数,数组大小是n,要求找到绝对值最小的数。
#define MAX 0x7fff
int findMinAbs(int arr[],int len)
{
int low = 0;
int high = len - 1;
int min = MAX;
while(low<=high){
int mid = low + (high - low>>1);
if(arr[mid] > 0){
if(arr[mid]<min)min = arr[mid];
high = mid - 1;
}
else if(arr[mid] < 0){
if(-arr[mid]<min)min = -arr[mid];
low = mid + 1;
}
else return 0;
}
return min;
}
6.题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
答案连接:点击打开链接
7.题目:一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。
答案连接:点击打开链接
8.在网上看到一个这样的题: 一个数组中含有1001个元素,存放了1,2,3...1000和一个重复的数。只有唯一一个数是重复的,其它均只出现一次。要求设计一个算法找出这个重复的数,要求:每个数组元素只能访问一次,不用辅助存储空间。
答案连接:http://blog.csdn.net/chdhust/article/details/11784545,该题在本博客面试题目搜集系列也该出了一种基于swap和标记的算法。
待续...