今天学了一下几种数组的表示方法
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);
}