面试题目收集(4)

本博客分享了面试题目搜集系列,包括数列生成、丑数计算、字符串压缩与逆序打印等经典问题,并提供了详细解答及代码实现。此外,还讨论了浏览器请求流程和网页加载过程,涉及DNS查找、HTTP请求、重定向、服务器响应和HTML渲染等多个关键环节。
摘要由CSDN通过智能技术生成

本博客的《面试题目搜集系列不错》

(1)面试题目搜集1

(2)面试题目搜集2

(3)面试题目搜集3

(4)面试题目搜集4

(5)面试题目搜集5

(6)面试题目搜集6



1.google一道面试题目:一个数列中Q中的每个元素至少能被a和b中的一个元素整除。现给定a和b,要求计算出Q的前几项。例如a=3,b=5,则序列:3,5,6,9,10,12....

思路:设计两个index,分别指向被3和被5整除的数,被3整除的数只能每次递增3,被5整除的数只能每次递增5。判断那个小,就添加到数组中,将添加到数组中的索引指向当前的索引。

个人觉得:这个何海涛里面的丑数解法有点雷同,我也是这么悟出来的,必须要设置一个数组保存前面的值

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void printArr(int arr[],int len)
{
	if(arr==NULL || len<0)
		throw new runtime_error("Invalid Input");

	for(int i=0; i<len; ++i){
		cout<<arr[i]<<" ";
	}
	cout<<endl;
}

void PrintQ(int num)
{
	int *arr = NULL;
	arr = new int[num];
    
	int fiveIndex = 1;
	int threeIndex = 0;
	int index = 2;

    arr[0] = 3;
	arr[1] = 5;

	while(index<num){
		int addFive = arr[fiveIndex] + 5;
		int addThree = arr[threeIndex] + 3;
		int min = addThree<=addFive?addThree:addFive;

		if(min == addThree) 
			threeIndex = index;
		if(min == addFive)
			fiveIndex = index;

		arr[index++] = min;
	}

	printArr(arr,num);

	delete[] arr;
}

int main()
{
	cout<<"By lsj:http://blog.csdn.net/lsjseu"<<endl;
	PrintQ(10);
	system("pause");
	return 0;
}


2.剑指offer上面的丑数:我们只把包含2、3、5的数称作丑数,习惯把1称为第一个丑数,求从小到大顺序的num个抽数。

呵呵:按照上面的思想重新解了一遍,换汤不换药。海涛老师给我的灵感。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void printArr(int arr[],int len)
{
	if(arr==NULL || len<0)
		throw new runtime_error("Invalid Input");

	for(int i=0; i<len; ++i){
		cout<<arr[i]<<" ";
	}
	cout<<endl;
}

int Min(int a,int b,int c)
{
	int t = a<b?a:b;
	return t<c?t:c;
}

void PrintUglyNum(int num)
{
	int *arr = NULL;
	arr = new int[num];
    
	int twoIndex = 0;
	int fiveIndex = 0;
	int threeIndex = 0;

	int index = 1;

    arr[0] = 1;

	while(index<num){
		int mutTwo = arr[twoIndex] * 2;
		int mutFive = arr[fiveIndex] * 5;
		int mutThree = arr[threeIndex] * 3;
		
		int mindata = Min(mutTwo,mutThree,mutFive);

		if(mindata == mutTwo) 
			++twoIndex;
		if(mindata == mutThree) 
			++threeIndex;
		if(mindata == mutFive)
			++fiveIndex;

		arr[index++] = mindata;
	}

	printArr(arr,num);

	delete[] arr;
}

int main()
{
	cout<<"By lsj:http://blog.csdn.net/lsjseu"<<endl;
	PrintUglyNum(11);
	system("pause");
	return 0;
}

3.google的一道笔试题目:一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"abc   efg  hij"打印为"cba gfe jih"。

思路:用string来解还是蛮不错的,然后借助栈来翻转,省得字符串烦来烦去

#include <iostream>
#include <string>
#include <stack>
using namespace std;


string reverseStr(string str)
{
	int len = str.size();
	string ret;
	stack<char> st;
	bool begin = true;

	for(int i=0; i<len;){
		if(i<len && str[i] == ' '){
			if(!begin)ret.append(1,' ');
			begin = false;
			while(str[i]==' ')
				i++;
		}
		else{
			while(i<len && str[i] != ' '){
				st.push(str[i]);
				i++;
			}
			while(!st.empty()){
				ret.append(1,st.top());
				st.pop();
			}
		}
	}
	return ret;
}

int main()
{
	string str = string("   abc   lsj  hlj");
	cout<<reverseStr(str)<<endl;

	system("pause");
	return 0;
}

4.面试员宝典的一道笔试题目:一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"i am    lsj"打印为"lsj am i"。

思路:先整体翻转,然后单词部分翻转

#include <iostream>
#include <string>
#include <stack>
using namespace std;


void reverseSub(char str[],int start,int end)
{
	if(!str||start<0||end<0)
		throw new runtime_error("Invalid Input");

	if(start>=end)
		return;

	for(;start<end;++start,--end){
		char t = str[start];
		str[start] = str[end];
		str[end] = t;

	}

}

void reverseStr(char str[])
{
	int len = strlen(str);

	reverseSub(str,0,len-1);
	
	int beg = 0;
	int end =0;

	cout<<str<<endl;

	for(int i=0; i<len;){
		while(i<len && str[i] != ' ')++i;
		end = i - 1;

		reverseSub(str,beg,end);
		
		while(i<len && str[i] == ' ')++i;
		beg = i;
	}
}

int main()
{
	char str[] = "ss   i am   lsj";
	reverseStr(str);
    
	cout<<str<<endl;

	system("pause");
	return 0;
}

5。描述在浏览器中敲入一个网址并按下回车后所发生的事情(尽量详细)
答:浏览器输入网址之后,首先
步骤1:需要查找域名的IP地址,DNS查找过程如下:
(1)浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
(2)系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。
(3)路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
(4)ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
(5)递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了。
步骤2:浏览器给web服务器发送一个HTTP请求。请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不同页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。
步骤3:服务的永久重定向响应
步骤4:浏览器跟踪重定向地址
步骤5:服务器“处理”请求
步骤6:服务器发回一个HTML响应
步骤7:浏览器开始显示HTML
步骤8:浏览器发送获取嵌入在HTML中的对象

有好题待续。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值