1.找到字符串中出现次数最少的字符
题目描写叙述
给定一个字符串(长度小于50)
找到该字符串出现次数最少的字符
假设有两个字符出现次数同样,并且均出现最少。那么ASCII码小的字符优先
输入
输入为一行字符串。不含空格
输出
输出出现次数最少的字符
例子输入
rra3
333444abcd
例子输出
3
a
解题思路:
先将字符串内部依据字符顺序排序,然后遍历一遍。记录出现次数最小的(假设有多个次数最小的。选排序在最前的)。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[105];
int main()
{
int len,i;
while(cin>>a)
{
len=strlen(a);
sort(a,a+len);
//cout<<a<<endl;
int min=105; //字符出现的最少次数赋初值
char res;
int p=1;
for(i=len-2; i>=0; i--)
{
if(a[i]==a[i+1]) //统计a[i+1]出现的次数
p++;
else
{
if(p<=min) //更新出现次数最少的
{
min=p;
res=a[i+1];
}
p=1;
}
}
if(p<=min) //推断a[0]
{
min=p;
res=a[0];
}
cout<<res<<endl;
}
}
/*
rra3
333444abcd
1112234
11223344
*/
2.归并两个已排序的数组(数组长度在1-20之间)。将其归并成一个顺序的数组
注意:在输出时。最后一个数字后边要打印一个空格
输入
第一行给定測试用例的个数N。接下来两行数据为一组,每行的第一个数是一个整数,表示的是该行数组的大小。
输出
输出每一个測试用例的结果。每行数据为一行。注意:在输出时,最后一个数字后边要打印一个空格
例子输入
2
4 1 3 5 7
3 2 4 6
2 3 5
3 -1 2 3
例子输出
1 2 3 4 5 6 7
-1 2 3 3 5
解题思路:
用两个指针遍历两个数组。每次输出小的。
代码:
#include<iostream>
using namespace std;
int a[105];
int b[105];
int main()
{
int tes;
int m,n;
int i,j;
while(cin>>tes)
{
while(tes--)
{
cin>>m;
for(i=0; i<m; i++)
cin>>a[i];
cin>>n;
for(i=0; i<n; i++)
cin>>b[i];
i=0,j=0;
while(i<m&&j<n) //两个数组里面用指针选小的
{
if(a[i]<b[j])
{
cout<<a[i]<<" ";
i++;
}
else
{
cout<<b[j]<<" ";
j++;
}
}
while(i<m) //a数组还有剩余
{
cout<<a[i]<<" ";
i++;
}
while(j<n) //b数组还有剩余
{
cout<<b[j]<<" ";
j++;
}
cout<<endl;
}
}
return 0;
}
/*
2
4 1 3 5 7
3 2 4 6
2 3 5
3 -1 2 3
*/
3.推断二叉树的先序遍历序列
题目描写叙述
一种线性表示二叉树的方式是使用先序遍历序列,假设遇到非空节点。我们记录它的值,假设遇到空节点,我们用固定字符或者数字表示。比如用数字0表示
比如上边这样一颗二叉树,其先序遍历序列为“9 3 4 0 0 1 0 0 2 0 6 0 0”,当中0表示空节点。给出一个线性序列,推断这个序列是否为一个二叉树的先序遍历序列。
序列中每一个非空节点的值均为非0整数,0表示空节点。节点之间用空格隔开,节点个数不超过20个
输入
输入一行序列。序列中每一个数字表示一个节点的值,非空节点的值均为非0整数,0代表空节点,节点之间用空格隔开,节点个数不超过20个。
输出
假设该序列是一个二叉树的先序遍历序列。输出一行“True”,否则输出“False”
例子输入
9 3 4 0 0 1 0 0 2 0 6 0 0
1 0
9 0 0 1
例子输出
True
False
False
解题思路:
首先一个二叉树必须是叶子节点个数等于枝干节点数+1。
即数组里面0的个数等于非0个数+1。假设不满足。直接输出False。
然后依照先序建立二叉树的方法。记录建立二叉树总共用的节点。
假设
1)建立二叉树使用的节点数index等于数组里数的个数n,
2)数组里面0的个数等于非0个数+1。
那么输出True,否则输出False。
代码:
#include<iostream>
#include<cstring>
#define maxn 1005
using namespace std;
char str[maxn];
int a[maxn];
int index;
typedef struct node
{
node *l;
node *r;
int val;
}*root;
void createBiTree(root T) //先序建立二叉树
{
if(a[index] == 0)
{
T = NULL;
index++;
}
else
{
T = new node;
T->val = a[index++];
createBiTree(T->l);
createBiTree(T->r);
}
}
int main()
{
int len,i,n;
while(gets(str))
{
n=0;
int tmp,flag;
tmp=flag=0;
len=strlen(str);
int cnt=0; //记录叶子节点个数
for(i=0; i<len; i++) //将字符串处理成int数组保存在数组a中
{
if(str[i]=='-')
{
flag=1;
}
else if(str[i]==' ')
{
if(flag)
tmp=0-tmp;
a[n]=tmp;
if(a[n]==0)
cnt++;
n++;
flag=0;
tmp=0;
}
else
tmp=tmp*10+(str[i]-'0');
}
if(flag)
tmp=0-tmp;
a[n]=tmp;
if(a[n]==0) cnt++;
n++;
if(cnt!=n-cnt+1) //叶子节点必须等于枝干节点+1
{
cout<<"False"<<endl;
continue;
}
index=0;
root T;
createBiTree(T);
if(n==index)
cout<<"True"<<endl;
else
cout<<"False"<<endl;
}
return 0;
}
/*
9 3 4 0 0 1 0 0 2 0 6 0 0
1 0
9 0 0 1
9 2 0 0 5 6 0 0 0
9 2 0 0 5 0 6 0 0
*/
4.最短路径和
题目描写叙述
输出一个大小为M×N的方格,每一个方格填满了非负整数。找到一条从左上角到右下角的路径,使得路径经过的全部方格内的值相加和最小
1 2 3
1 1 1
比如如上方格,从左上角開始先向下走,再向右走。得到的路径和最短。最短为1+1+1+1=4
注意:在随意时刻。你仅仅有向下移动或者向右移动。
输入
输入第一行为该方格的行数和列数。行数和列数不超过1000。
接着输入数字矩阵
输出
输出最短路径和
例子输出
2 3
1 2 3
1 1 1
1 1
3
例子输出
4
3
解题思路:
在随意时刻。你仅仅有向下移动或者向右移动。
不论什么一个状态仅仅能从上方或者左方得到。
用二维数组a存储该方格。用dp[i][j]表示到达第i行第j列这个数的最小值。
1)dp[1][j]仅仅能从左方得到。dp[1][j]=dp[1][j-1]+a[1][j];
2) dp[i][1]仅仅能从上方得到。dp[i][1]=dp[i-1][1]+a[i][1];
3) dp[i][j](i>1,j>1)能够从左方和上方得到。状态转移方程为
dp[i][j] = min(dp[i-1][j] , dp[i][j-1]) +a[i][j]
最后输出dp[m][n]即为结果
代码:
#include<iostream>
#define maxn 1005
using namespace std;
int a[maxn][maxn];
int dp[maxn][maxn];
int mi(int p1,int p2)
{
if(p1<p2) return p1;
return p2;
}
int main()
{
int m,n;
int i,j;
while(cin>>m>>n)
{
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
cin>>a[i][j];
dp[0][1]=0;
dp[1][0]=0;
for(i=1; i<=m; i++)
dp[i][1]=a[i][1]+dp[i-1][1];
for(i=1; i<=n; i++)
dp[1][i]=a[1][i]+dp[1][i-1];
for(i=2; i<=m; i++)
{
for(j=2; j<=n; j++)
{
dp[i][j]=mi(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
/*for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
cout<<dp[i][j]<<" ";
}
cout<<endl;
}*/
cout<<dp[m][n]<<endl;
}
}
5.找出一个缺失的正整数
描写叙述
给定一个未排序的数组,找出一个缺失的正整数
比如
数组 1 2 0
有正整数1和2。缺失的第一个正整数是3
输入
输入为一个未排序的整数数组。数组长度不超过1000000
输出
输出为整数数组中第一个缺失的正整数
例子输入
1 2 0
3 4 -1 1
例子输出
3
2
解题思路:
把全部的正正整数都映射到map里面。
然后从最小的正整数1開始找,假设没有被映射。便输出。然后结束。
代码:
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
char str[1005];
map <int,int> mq;
int main()
{
int len,i;
while(gets(str))
{
mq.clear();
int tmp,flag;
tmp=flag=0;
len=strlen(str);
for(i=0; i<len; i++) //将字符串处理成int数组保存在数组a中
{
if(str[i]=='-')
{
flag=1;
}
else if(str[i]==' ')
{
if(!flag) //负数不须要处理
{
mq[tmp]=1;
}
flag=0;
tmp=0;
}
else
tmp=tmp*10+(str[i]-'0');
}
if(!flag)
mq[tmp]=1;
for(i=1;; i++)
{
if(!mq[i])
{
cout<<i<<endl;
break;
}
}
}
return 0;
}