学习报告:第n天

今天学了一下几种数组的表示方法

int arr[];
printf("%d",*arr);//把数组看成指针
int *p=&arr;
printf("%d",*p);//可以通过指针的操作来表达数组不同元素
printf("%d",arr[0]);//这个就是基础的了

然后今天用代码来复习昨天学的指针,用指针,函数,数组写了个冒泡排序

#include <stdio.h>
void swap(int *p,int len)
{
    int teap;
    for(int i=0;i<len;i++){
        for(int j=i;j<len;j++){
            if(p[i]>p[j]){
                teap=p[i];
                p[i]=p[j];
                p[j]=teap;
            }
        }
    }
}
int main()
{
    int i;
    int arr[5]={5,4,3,2,1};
    int len=sizeof(arr)/sizeof(arr[0]);//这个也是今天刚刚学的求数组长度的一个方法
    swap(arr,len);
    for(i=0;i<len;i++){
        printf("%d ",arr[i]);
    }
}

下面就是刷的一些题:

题目描述

又来到了四年一度的主席竞选大赛,然后有n个候选人,编号分别是从1-n,现在需要你统计出票数最多的候选人是谁

输入

输入n

然后依次是n行

下面第几行就代表第几个候选人的票数

输出

输出最多票数的候选人编号以及票数

样例输入 复制
5
98765
12365
87954
1022356
985678
样例输出 复制
4
1022356
提示

票数可能会达到100位数字

n<=20

题目理解:就是大数的相比,利用字符串就可以写出来:

#include <stdio.h>
#include <string.h>
int main()
{
    int i,j,teap,max,folg;
    char str[100][101];//这个地方也可以使用结构体,不过我感觉这样子更简单一点,二维数组
    int n;
    int arr[101];//
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s",&str[i]);//第一个i为计数的
        getchar();
        arr[i]=strlen(str[i]);
    }
    /*for(i=0;i<n;i++){
        printf("%d ",arr[i]);
    }*/
    max=-1;
    for(i=0;i<n;i++){
        if(max<arr[i]){
            max=arr[i];
            teap=i;
        }
        folg=teap;
        if(max==arr[i]){
            for(j=0;j<max;j++){
                if(str[teap][j]==str[i][j]){
                    continue;
                }
                if(str[teap][j]!=str[i][j]){
                    if(str[teap][j]>str[i][j]) {teap=teap;break;}
                    if(str[teap][j]<str[i][j]) {teap=i;break;}
                }
            }
        }
    }
    printf("%d\n%s",folg+1,str[folg]);
}
题目描述

利用直接插入排序算法实现线性表的排序。要求输出第k趟排序的结果。例如原来线性表为:26,12,25,4,36,15,21,第一趟直接排序排序结果为: 12,26,25,4,36,15,21,第二趟直接插入排序结果为: 12,25,26, 4,36,15,21。

输入

输入包含若干个测试用例,第一行为测试用例个数。每个测试用例占3行,第一个为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行为k(1<=k<=n-1),即要求的第k趟排序结果。

输出

对每一测试用例,用一行输出第k趟排序结果,用空格隔开。

样例输入 复制
1
5
2 4 1 9 7
3
样例输出 复制
1 2 4 9 7

题目理解:最开始看这个题目,以为就是简单的冒泡排序,然后发现不是,然后又以为是走一轮然后重新走,发现也不行,它是要前后两个数字相比,要这样子才ok

错误代码:

#include <stdio.h>
int main()
{
    int T,n,k,i,teap,j;
    int arr[1001];
    scanf("%d",&T);
    while(T)
    {
        int folg=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }
        scanf("%d",&k);
        for(i=0;;i++){
            for(j=0;j<n-1;j++){
                if(arr[j]>arr[j+1]){
                    teap=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=teap;
                    folg++;
                    break;
                }
            }
            if(folg==k-1){
                break;
            }
        }
        for(i=0;i<n;i++){
            printf("%d ",arr[i]);
        }
        T--;
    }
}

正确的

#include <stdio.h>
int main()
{
    int T,n,k,i,teap,j;
    int arr[1001];
    scanf("%d",&T);
    while(T)
    {
        int folg=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }
        scanf("%d",&k);
        for(i=0;;i++){
            for(j=i+1;j<n;j++){
                if(arr[i]>arr[j]){
                    teap=arr[i];
                    arr[i]=arr[j];
                    arr[j]=teap;
                    folg++;
                    break;
                }
                folg++;
            }
            if(folg==k){
                break;
            }
        }
        for(i=0;i<n-1;i++){
            printf("%d ",arr[i]);
        }
        printf("%d\n",arr[n-1]);
        T--;
    }
}
题目描述

给定一个长度为n的序列a,选出其中连续且非空的一段使得这一段的和最大。

输入

第一行输入一个整数n (n < 1e5)

第二行输入n个整数a[i] (-1e4 < a[i] < 1e4)

输出

输出这个序列中最大的子段和。

样例输入 复制
7 
2 -4 3 -1 2 -4 3
样例输出 复制
4

题目理解:最开始以为要多个数组,一个来记录,一个来相加,然后再比较,发现这样子太麻烦了,然后就想了一下,发现可以用一个东西来记录,要是小于0就归0,重新开始相加

#include <stdio.h>
int main()
{
    int i,n,max,sum=0;//记得给sum初始值
    int arr[100001];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    max=arr[0];//这个地方只能是arr中的一个元素,因为我要是0的话,有可能数组中的元素都是负数,这样子就错了
    for(i=0;i<n;i++){
        sum+=arr[i];
        if(sum>=max){
            max=sum;
        }
        if(sum<=0){
            sum=0;
        }
    }
    printf("%d",max);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值