• 数组练习


     

    3.给定某个拥有 5 个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数

    //组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’} 则将被转换成 12332。

    //处理整形数组

    /*int main(int argc, const char * argv[]) {

        int a[100];

        int cnt=0;

        int sum=0;

        for (int i=0; i<100; i++) {

            scanf("%d", &a[i]);

            cnt++;

            if (getchar()==' ') {

                break;

            }

        }

        

        for (int i=0; i<cnt; i++) {

            sum = sum*10+a[i];

        }

        printf("sum = %d ", sum);

        

        return 0;

    }*/

    //处理字符数组

    #if 0

    int main(int argc, const char * argv[]) {

        char ch[100];

        int cnt=0;

        int sum=0;

        for (int i=0; i<100; i++) {

            scanf("%c", &ch[i]);

            if (ch[i]==' ') {

                ch[i]='';

                break;

            }

            cnt++;

        }

        

        for (int i=0; i<cnt; i++) {

            sum = sum*10+(ch[i]-'0');

        }

        printf("sum = %d ", sum);

        

        return 0;

    }

    #endif

    //7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为

    //1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。

    //8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。

    #include <string.h>

    float judgeChar(char ch)

    {

        if ((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) {

            return 1.0;

        }

        else if(ch>='0' && ch <= '9')

        {

            return 0.5;

        }

        else

        {

            return 0.8;

        }

    }

    #if 0

    int main(int argc, const char *argv[])

    {

        char str[100];

        float sum =0.00;

        scanf("%s", str);

        int len = (int)strlen(str);//求字符串有效字符个数,不包含'';

        for (int i=0; i<len; i++) {

            sum+=judgeChar(str[i]);

        }

        printf("sum = %.2f ", sum);

        return 0;

    }

    #endif

    #if 0

    int main(int argc,const char *argv[])

    {

        char str[100];

        scanf("%s",str);

        int len = (int)strlen(str);

        float sum =0;

        for (int i=0; i<len; i++) {

            sum+=judgeChar(str[i]);

            if (sum>10) {

                str[i]='';

                break;

            }

            if (sum==10) {

                str[i+1]='';

                break;

            }

        }

        printf("str = %s ", str);

        return 0;

    }

    #endif

    //给定一个整型数组,数组的长度为 N(N>3),从数组中寻找一个连续的长度为 3 的子数组,要求该子数组的和最大。

    #if 0

    int main(int argc, const char *argv[])

    {

        int a[100];

        int cnt=0;

        for (int i=0; i<100; i++) {

            scanf("%d", &a[i]);

            cnt++;

            if (getchar()==' ') {

                break;

            }

        }

        int max = a[0]+a[1]+a[2];

        for (int i=1; i<cnt-2; i++) {

            if (max<a[i]+a[i+1]+a[i+2]) {

                max = a[i]+a[i+1]+a[i+2];

            }

        }

        printf("max = %d ", max);

        return 0;

    }

    #endif

    //41.编写函数将一个n*n矩阵转置,例如:(****)

    //1 2 3 4     1 5 3 4

    //5 6 7 8 ->  2 6 2 7

    //3 2 5 9     3 7 5 2

    //4 7 2 3     4 8 9 3

    //void reverseArr(int *a[], int n)

    //{

    //

    //    return 0;

    //}

    #if  0

    int main(int argc,const char *argv[])

    {

        int a[4][4]={{1,2,3,4},

                     {5,6,7,8},

                     {3,2,5,9},

                     {4,7,2,3}};

        

        for (int i=0; i<4-1; i++) {

            for (int j=i+1; j<4; j++) {

                int temp = a[i][j];

                a[i][j]=a[j][i];

                a[j][i]=temp;

            }

        }

        for (int i=0; i<4; i++) {

            for (int j=0; j <4; j++) {

                printf("%d ", a[i][j]);

            }

            printf(" ");

        }

        return 0 ;

    }

    #endif

    //猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

    #if  0

    int main(int argc,const char *argv[])

    {

        int a[10]={};

        a[9]=1;

        for (int i=8; i>=0; i--) {

            a[i]=(a[i+1]+1)*2;

        }

        

        printf("%d ", a[0]);

        return 0;

    }

    #endif

    //围圈报数

    //有m个人围成一圈,顺序排号。从第一个人开始报数(从1到n报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位。

    //5 3  --> 4

    //6 2  --> 5

    //0 0 0 4 0

    //

    #if 0

    int main(int argc, const char *argv[])

    {

        int a[100];

        int m, n;

        int cnt = 0;//统计退出的人数

        scanf("%d %d", &m , &n);

        if (m<1||m>100 || n<1) {

            return -1;

        }

        int i=0;

        for (i=0; i<m; i++) {//给数组赋值

            a[i]=i+1;

        }

        int k=0;//报数

        i = 0;

        while (cnt<m-1) {

            if(a[i])

            {

                k++;

                if (k==n) {

                    a[i]=0;

                    k=0;

                    cnt++;

                }

            }

            i++;

            if (i==m) {//边界处理

                i=0;

            }

        }

        for (int i=0; i<m; i++) {

            if (a[i]) {

                printf("%d", i+1);

            }

        }

        printf(" ");

        return 0;

    }

    #endif

    //3.输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列

    //比如:

    //输入:1 5 9 8 12 21 3 0 -1 9

    //输出:

    //1 5 9

    //9 8

    //8 12 21

    //21 3 0 -1

    //-1 9

    //

    //输入: 3 9 8 -11 4 21 8 -3 0 2

    //输出:

    //3 9

    //9 8 -11

    //-11 4 21

    //21 8 -3

    //-3 0 2

    #if 0

    int main(int argc,const char *argv[])

    {

        int a[10]={};

        for (int i=0; i<10; i++) {

            scanf("%d", &a[i]);

        }

        

        printf("%d ", a[0]);

        for (int i=1; i<9; i++) {

            printf("%d ", a[i]);

            if ((a[i]>a[i-1] && a[i]>a[i+1]) || (a[i]<a[i-1] && a[i]<a[i+1])) {

                putchar(' ');

                printf("%d ", a[i]);

            }

        }

        printf("%d ", a[9]);

        return 0;

    }

    #endif

    //2. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限

    //比如:

    //输入:5 18

    //输出:

    //1  2  3  4  5

    //16 17 18 0  6

    //15 0  0  0  7

    //14 0  0  0  8

    //13 12 11 10 9

    //

    //输入: 4 12

    //输出:

    //1  2  3  4

    //12 0  0  5

    //11 0  0  6

    //10 9  8  7

    #if 0

    int main(int argc, const char *argv[])

    {

        int a[20][20]={};

        int m,n;

        scanf("%d%d", &n,&m);

        if (n<1 || m>n*n|| m<0) {

            return -1;

        }

        int s1=n-1, s2=n-1, s3=0, s4=1;//控制边界

        int i=0,j=0;//控制二维数组下标

        int type=1;//1:从左往右赋值, 2:从上往下赋值,3:从右往左赋值 4: 从下往上赋值

        int cnt=1;//表示赋值的数

        while (cnt<=m) {

            a[i][j]=cnt;//赋值

            switch (type) {

                case 1://从左往右赋值

                    if (j==s1) {

                        type=2;

                        s1--;

                        i++;

                    }

                    else

                    {

                        j++;

                    }

                    break;

                case 2://从上往下赋值

                    if (i==s2) {

                        type =3;

                        s2--;

                        j--;

                    }

                    else

                    {

                        i++;

                    }

                    break;

                case 3://从右往左赋值

                    if (j==s3) {

                        type =4;

                        s3++;

                        i--;

                    }

                    else

                    {

                        j--;

                    }

                    break;

                case 4://从下往上赋值

                    if (i==s4) {

                        type =1;

                        s4++;

                        j++;

                    }

                    else

                    {

                        i--;

                    }

                    break;

                default:

                    break;

            }

            cnt++;

        }

        

        for (int i=0; i<n; i++) {

            for (int j=0; j<n; j++) {

                printf("%4d", a[i][j]);

            }

            printf(" ");

        }

        return 0;

    }

    #endif

    //4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出)

    //比如:

    //输入:1 2 2 3 2 5 5 7 8 9

    //输出:2 5

    //     1 3 0 1 0 2 0 1 1 1

    //  max =2;

    // 2 5

    //数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1

    //

    //算法:

    //(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1,

    //(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较

    //

    //伪代码:

    //

    //定义数组保存每个元素次数

    //

    //使用双层循环遍历数组

    //如果当前元素后后面元素相等, 并且后面的元素次数不为0

    //当前元素次数+1, 后面的元素次数设置为0

    //

    //从保存每个元素次数的数组中查找最大的值

    #if 0

    int main(int argc,const char *argv[])

    {

        int a[10]={};

        int count[10];

        for (int i=0; i<10; i++) {

            scanf("%d", &a[i]);

        }

        for (int i=0; i<10; i++) {

            count[i]=1;

        }

        for (int i=0; i<10; i++) {

            if (count[i]) {

                for (int j=i+1; j<10; j++) {

                    if (a[i]==a[j] && count[j]) {

                        count[i]++;

                        count[j]=0;

                    }

                }

            }

        }

        

    //    for (int i=0; i<10; i++) {

    //        printf("%d ", count[i]);

    //    }

        //查找count最大值

        int max = count[0];

        for (int i=1; i<10; i++) {

            if (max<count[i]) {

                max = count[i];

            }

        }

        

        //输出出现最多次数的值

        

        for (int i=0; i<10; i++) {

            if (max == count[i]) {

                printf("%d ", a[i]);

            }

        }

        printf(" ");

        

        return 0;

    }

    #endif

    //5.魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。

    //比如:

    //输入:3

    //输出:

    //6 1 8

    //7 5 3

    //2 9 4

    //(1)将1放在第一行中间一列;

    //(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数减1(例如上面的三阶魔方阵,5在4的上一行后一列);

    //(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

    //(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行 第一列,则3应放在第二行最后一列;

    //(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

    int main(int argc,const char *argv[])

    {

        int a[19][19]={};

        int m;

        scanf("%d", &m);

        if (!(m%2) || m<3 ||m>19) {

            return -1;

        }

        int i=0,j=m/2;

        int cnt =1;

        int temi,temj;

        while (cnt<=m*m) {

            a[i][j]=cnt;

            temi = i;//保存上一个数的下标

            temj = j;

            i--;//变换下标

            j--;

            if(temi==0)//变换行标

            {

                i = m-1;

            }

            if (temj==0)//变换列标

            {

                j = m-1;

            }

            if(a[i][j])

            {

                i = temi+1;

                j = temj;

            }

            cnt++;

        }

        for (int i=0; i<m; i++) {

            for (int j=0; j<m; j++) {

                printf("%4d", a[i][j]);

            }

            printf(" ");

        }

        return 0;

    }

    让明天,不后悔今天的所作所为
  • 相关阅读:
    java异常
    集群、分布式、负载均衡区别
    基本数据结构的比较
    记录一次tomcat问题排查记录:org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19
    记录 Java 的 BlockingQueue 中的一些坑
    Java高级面试题解析(二):百度Java面试题前200页(精选)
    学习netty遇到的关于 LineBasedFrameDecoder 的问题
    ThreadPoolExecutor 入参 corePoolSize 和 maximumPoolSize 的联系
    TreeMap 的排序冲突吗
    checkbox jquery操作总结
  • 原文地址:https://www.cnblogs.com/-yun/p/4256785.html
Copyright © 2020-2023  润新知