zoukankan      html  css  js  c++  java
  • 帝国国王科技大学上机题解(二)

    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

    有正整数12。缺失的第一个正整数是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;
    }



  • 相关阅读:
    js 函数声明和函数表达式的区别
    使用dom4j工具包对xml文件解析
    xml的schema约束
    xml的DTD约束
    C3P0连接池工具类使用
    jdbc连接警告不安全
    java的unity单元测试
    BootStrap容器介绍
    validate插件实现表单效验(二)
    validate插件实现表单效验(一)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7267722.html
Copyright © 2011-2022 走看看