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,用除留余数法定义的散列函数将关键字映射 ...
随机推荐
- gcd&&lcm
1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中 ...
- 由一道面试题想到的:Finally
找工作时,有这样一道题: try{}里面有一条return语句,那么紧跟在这个try后的finally{}里的代码会不会执行,什么时候执行,在return之前还是之后? 我没有怎么思考,根据脑子里仅有 ...
- Linux命令学习篇0——原产地
昨天在用curl发送简单的HTTP请求做測试的时候发现自己每次使用的时候都是在网络上查看别人的演示样例才干想起来怎么用,这样效率太低了.尽管有网络依旧在,可是总感觉不是被自己掌握着,心里不踏实,回忆起 ...
- 大数据系列修炼-Scala课程11
接着昨天的list,也是学习集合的相关知识 ListBuffer.ArrayBuffer.Queue.stack相关操作 1.ListBuffer.ArrayBuffer代码实现:ListBuffer ...
- 杭电1162Eddy's picture
Eddy's picture Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tota ...
- crawler_浅谈网络爬虫
题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
原文:使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示 首先来看一看实现的效果: PS:原始的程序中更新曲线数据时添加了过渡的效果,具体可 ...
- linux-ubuntu关闭防火墙
SYNOPSIS iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-t table] {-A|-C|-D} cha ...
- JS Tree
jQuery插件实例七:一棵Tree的生成史 在需要表示级联.层级的关系中,Tree作为最直观的表达方式常出现在组织架构.权限选择等层级关系中.典型的表现形试类似于: 一颗树的生成常常包括三个部分:1 ...
- Qt5官方demo分析集29——Extending QML - Property Value Source Example
此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集28--Extend ...