c语言算法题目求职用
1.栈的压入与压出
/*
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。n<=100000 用一个栈作辅助,顺序描述压入序列和弹出序列,如果当前位置上压入序列和弹出序列值相等,直接都向后移一个元素;比较栈顶元素和弹出序列当前值,如果相等,出栈,弹出序列后移一个元素;其余情况,将压入序列当前值压栈,压入序列后移一个元素。如果到最后,弹出序列都处理不完,说明弹出序列不合法。时间复杂度为O(n)。
*/
#include <stdio.h>
#include <stack>
using namespace std; int qin[];
int qout[];
int main(void)
{
int n;
int i,j;
while(scanf("%d", &n) == )
{
for(i=; i<n; ++i)
scanf("%d", &qin[i]);
for(i=; i<n; ++i)
scanf("%d", &qout[i]); stack<int> s;
i = ;
j = ;
while(i<n || j<n)
{
if(i<n && j<n && qin[i]==qout[j])
{
++i;
++j;
}
else
{
if(s.empty())
{
if(i<n)
s.push(qin[i++]);
}
else if(s.top() == qout[j])
{
s.pop();
++j;
}
else if(i<n)
{
s.push(qin[i++]);
}
else
{
break;
}
}
} if(j==n)
printf("Yes\n");
else
printf("No\n");
} return ;
}
2.二叉搜索书的后续遍历序列
/*
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。n<=10000。 二叉搜索树的性质之一为:根结点值大于左子树,小于右子树。设后序遍历顺序为 A B C,则有A<C<B。因此,从根结点(遍历的最后一个结点)出发,向前找到所有连续的大于根结点的值作为右子树,再往前的所有连续小于根结点的作为左子树,如果往前还有大于根结点的,则不是二叉搜索树的后序遍历结果。递归处理左子树和右子树。时间复杂度约为O(nlogn)。
*/
#include <stdio.h> int seq[];
bool valid(int x, int y)
{
if(x >= y)
return true; int i=y-;
while(i>=x && seq[i]>seq[y])
{
--i;
}
int j = i;
while(i>=x && seq[i]<seq[y])
{
--i;
}
if(i>=x)
return false; if(!valid(x, j))
return false; if(!valid(j+, y-))
return false; return true;
} int main(void)
{
int n;
while(scanf("%d", &n) == )
{
for(int i=; i<n; ++i)
scanf("%d", &seq[i]); if(valid(, n-))
printf("Yes\n");
else
printf("No\n");
} return ;
}
3.数组中出现次数超过一半的数字
/*
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。n<=100000 将出现一半的数与其他数两两抵消,剩余的最后一个数即是答案。具体做法是每次选两个不同的数两两抵消,要么会抵消一个答案数字和一个非答案数字,要么抵消两个非答案数字,到最后剩余的一定是答案。时间复杂度为O(n)。
*/
#include <stdio.h> int f[];
int main(void)
{
int i,n;
while(scanf("%d", &n) == )
{
int ans = ;
int count = ;
for(i=; i<n; ++i)
{
scanf("%d", &f[i]);
if(count == )
{
ans = f[i];
count = ;
}
else if(f[i] == ans)
{
++count;
}
else
{
--count;
}
} count = ;
for(i=; i<n; ++i)
{
if(f[i] == ans)
++count;
} if(count > n/)
printf("%d\n", ans);
else
printf("-1\n");
} return ;
}
4.整数中1出现的次数
/*
求两个整数间的数,10进制各个位上1出现的总次数,0<=a,b<=1,000,000,000 按位统计,统计每位上1出现的次数。当前位刚好是1和刚好是0需要单独考虑。
*/
#include <stdio.h> long long CountOne(long long x)
{
long long base = ;
long long ans = ;
long long temp;
long long rec = ;
while(x)
{
temp = x/;
ans += temp * base;
if(x% > )
ans += base;
else if(x% == )
{
ans += rec + ;
}
rec += x% * base;
base *= ;
x /= ;
}
return ans;
} int main(void)
{
long long a,b;
while(scanf("%lld%lld", &a, &b) == )
{
long long sa = , sb = ;
if(a>b)
{
a += b;
b = a - b;
a = a - b;
}
if(a>)
sa = CountOne(a-);
sb = CountOne(b);
printf("%lld\n", sb-sa);
}
return ;
}
5.数组中的逆袭对
/*
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 归并排序,在merge的时候统计逆序对,设需要merge的数组为A,B,A大小为n,B大小为m。如果A[i]>B[j],则逆序数将增加n-i。
*/
#include <stdio.h> int f[];
int g[];
long long ans;
void Sort(int x, int y)
{
if(x >= y)
return ; int mid = (x+y)>>;
Sort(x, mid);
Sort(mid+, y); int i = x;
int j = mid+;
int k = x;
while(i<=mid || j<=y)
{
if(i>mid)
{
g[k++] = f[j++];
}
else if(j>y)
{
g[k++] = f[i++];
}
else if(f[i]<=f[j])
{
g[k++] = f[i++];
}
else if(f[i]>f[j])
{
ans += mid - i + ;
g[k++] = f[j++];
}
}
for(k=x; k<=y; ++k)
f[k] = g[k];
} int main(void)
{
int n;
while(scanf("%d", &n) == )
{
for(int i=; i<n; ++i)
scanf("%d", &f[i]); ans = ;
Sort(, n-);
printf("%lld\n", ans);
} return ;
}
6.和为s的两个数字
/*
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S。n<=1000000 用两个游标,一个从头开始A[i],一个从尾开始A[j],如果A[i]+A[j]<S,则i后移一格,否则j前移一格,如果相等,则记录结果。算法复杂度为O(n)。
*/
#include <stdio.h> long long num[];
int main(void)
{
int n;
long long m;
while(scanf("%d%lld", &n, &m) == )
{
int i,j;
for(i=; i<n; ++i)
scanf("%lld", &num[i]); i = ;
j = n-;
long long x=-, y=-;
long long v;
long long res = num[j]*num[j];
while(i<j)
{
v = num[i] + num[j];
if(v == m)
{
if(num[i]*num[j] <= res)
{
x = num[i];
y = num[j];
res = num[i]*num[j];
}
++i;
--j;
}
else if(v < m)
{
++i;
}
else
{
--j;
}
}
printf("%lld %lld\n", x, y);
} return ;
}
7.猜数字游戏
/*
给定n个骰子,每个骰子点数为m,求按概率排序前3的点数和。 概率值按 4 舍 5 入要求保留 2 位小数, n(0<=n<=10),m(6<=m<=8)。 递推,令f[i][j]表示前i个骰子,点数和为j的次数。有f[i][j] = f[i-1][j-1]+....+f[i-1][j-m]。也可直接用一维的轮换数组进行计算,即g[j] = f[j-1]+...+f[j-m], f=g。
*/
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std; struct T
{
int id;
double v;
}; bool cmp(const T &a, const T &b)
{
if(a.v>b.v)
return true;
else if(a.v<b.v)
return false;
else
return a.id<b.id;
} int main(void)
{
int n,m;
bool first = true;
while(scanf("%d", &n)== && n)
{
scanf("%d", &m);
int f[] = {};
int g[] = {};
int i,j,k;
for(i=; i<=m; ++i)
f[i] = ; for(i=; i<n; ++i)
{
for(j=; j<=; ++j)
g[j] = ; for(j=; j<=; ++j)
{
for(k=; k<=m; ++k)
{
if(j-k>)
{
g[j] += f[j-k];
}
}
} for(j=; j<=; ++j)
f[j] = g[j];
} int sum = ;
vector<T> ans;
T t;
for(i=; i<=; ++i)
{
if(f[i] > )
{
sum += f[i];
t.id = i;
t.v = f[i];
ans.push_back(t);
}
}
for(i=; i<ans.size(); ++i)
{
ans[i].v = ((int)(100.0*ans[i].v/sum+0.5))/100.0;
}
sort(ans.begin(), ans.end(), cmp); if(first)
first = false;
else
printf("\n"); for(i=; i<; i++)
{
printf("%d %.2lf\n", ans[i].id, ans[i].v);
}
} return ;
}
c语言算法题目求职用的更多相关文章
- iOS面试中常见的算法题目
一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...
- Top Coder算法题目浏览器
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...
- 一道算法题目, 二行代码, Binary Tree
June 8, 2015 我最喜欢的一道算法题目, 二行代码. 编程序需要很强的逻辑思维, 多问几个为什么, 可不可以简化.想一想, 二行代码, 五分钟就可以搞定; 2015年网上大家热议的 Home ...
- 【起】ACM类下为过往所做过的部分算法题目
[起]ACM类下为过往所做过的部分算法题目 几百道题,日后细细品味.
- [优化]Steamroller-freecodecamp算法题目
晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...
- Map the Debris -freecodecamp算法题目
Map the Debris 1.要求 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: ...
- LeetCode算法题目解答汇总(转自四火的唠叨)
LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
随机推荐
- 【Espruino】NO.12 加速度计演示
http://blog.csdn.net/qwert1213131/article/details/31035403 本文属于个人理解,能力有限,纰漏在所难免.还望指正! [小鱼有点电] [Espru ...
- 【超酷超实用】CSS3可滑动跳转的分页插件制作教程
原文:[超酷超实用]CSS3可滑动跳转的分页插件制作教程 今天我要向大家分享一款很特别的CSS3分页插件,这款分页插件不仅可以点击分页按钮来实现分页,而且可以滑动滑杆来实现任意页面的跳转,看看都非常酷 ...
- OOP 创建对象的7种方式
JavaScript OOP 创建对象的7种方式 我写JS代码,可以说一直都是面向过程的写法,除了一些用来封装数据的对象或者jQuery插件,可以说对原生对象了解的是少之又少.所以我拿着<J ...
- JS中call、apply的用法说明
JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...
- linux_增加用户组_删除用户
添加账号组 /usr/sbin/groupadd iknow 添加账号 /usr/sbin/useradd -g iknow -d /home/iknow/ iknow 更改密码 passwd 选项 ...
- 完整详细的说明GCD列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f
为什么要写这个系列,由于百度了一下.我们正在寻找一个非常比较片面的Blog.抄来抄去,写作是很粗糙. 所以,我想写这个系列,尝试记录官方网站GCD强大的全功能的表达.为了方便他们,也方便他人,假设有发 ...
- 分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用
原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X ...
- 微信公众平台消息接口开发-封装weixin.class.php
原文:微信公众平台消息接口开发-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...
- android 当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出
当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出,比方在63层按back 键退回到44层的时候,file manager自己主动退出. 1.FileMana ...
- lua本学习笔记功能
Lua本学习笔记功能 1. 函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...