C博客作业04--数组

0.展示PTA总分


1.本章学习总结

1.1二分法查找

1.首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
2.如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤1的操作。
3.如果某一步数组为空,则表示找不到目标元素。

int binary( int *a, int key, int n )
{
    int left = 0, right = n - 1, mid = 0;
    mid = ( left + right ) / 2;
 
    while( left < right && a[mid] != key )
    {
        if( a[mid] < key ) {
        	left = mid + 1;
        }else if( a[mid] > key ) {
            right = mid - 1;
        }else {
        	return mid;
        }
        mid = ( left + right ) / 2;
    }
    if( a[mid] == key )   return mid;
    return -1;
}

1.2数组中插入数据

1.找到数据插入的位置,移动数组并插入数组。

#include <stdio.h>
main()
{
	int n,i,j,x,a[11];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	scanf("%d",&x);
	i=0;
	while(a[i]<x&&i<n)
         i++;
	for (j=n-1;j>=i;j--)
	{
		a[j+1]=a[j];
	}
	a[i]=x;
	for(i=0;i<n+1;i++)
	printf("%d ",a[i]);
 }

1.3数组中删除数据

完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置。 重复若干次这样的删除,得到最后的结果。

#include<stdio.h>
int main()
{
	int a[101], n, k,t,temp;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	scanf("%d", &k);
	for (int i = 1; i <= k; i++)
	{
		scanf("%d", &t);
		a[t] = 0;
		for (int j = t; j <= n; j++)
			a[j] = a[j + 1];
	}
	for (int i = 1; i <= n - k; i++)
		if (i == 1)
			printf("%d", a[i]);
		else
			printf(" %d", a[i]);
	return 0;
}

1.4排序

1.冒泡排序
从尾部开始比较相邻的两个元素,如果尾部的元素比前面的大,就交换两个元素的位置。往前对每个相邻的元素都做这样的比较、交换操作,这样到数组头部时,第 1 个元素会成为最大的元素。重新从尾部开始第 1、2 步的操作,除了在这之前头部已经排好的元素。继续对越来越少的数据进行比较、交换操作,直到没有可比较的数据为止,排序完成。

#include<stdio.h>

int *bubble_sort(int arr[], int len);

int main() {
    int *result, len;
    int data[] = {12, 43, 23, 13, 65, 17, 98, 45, 67, 88};
    len = (int)sizeof(data) / sizeof(*data);
    printf("使用冒泡排序前的原始数据是:");
    for (int i = 0; i < len; i++) {
        printf("%3d", data[i]);
    }
    printf("
");
    result = bubble_sort(data, len);
    printf("使用冒泡排序后的数据是:");
    for (int j = 0; j < len; j++) {
        printf("%3d", *(result + j));
    }
    return 0;
}
int *bubble_sort(int arr[], int len) {
    int temp;

    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        printf("第%d次循环排序后结果:", i + 1);
        for (int k = 0; k < len; k++) {
            printf("%3d", arr[k]);
        }
        printf("
");
    }
    return arr;
}

2.选择排序
首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到所有的数从小到大排序。

#include<stdio.h>
int main()
{
    int array[10];
    //输入初始值
    for(int i=0;i<10;i++)
    {
        scanf("%d",&array[i]);
    }
    for(int i = 0;i<10;i++)
    {
        for(int j = i;j<10;j++)
        {
            //如果i位置的之比后面的值大,就交换,通过这样交换后,0-9依次增大
            int tmp = 0;
            //printf("%d %d
",array[i],array[j]);
            if(array[i]>array[j])
            {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
    //输出结果
    for(int i = 0;i<10;i++)
    {
        printf("%d ",array[i]);
    }
    printf("
");
    return 0;
}

1.5数组做枚举

统计单词的个数:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	char s[1000];
	int n=0,t=0;
	while((s[n]=getchar())!='
')
	{
		n++;
	}
	s[n]=' ';  //0-n
	for(int i=0;i<=n;i++)
	 if(s[i]!=' '&&s[i+1]==' ')
	   t+=1;
	printf("%d",t);
	return 0;
} 

1.6哈希数组

有重复的数据I:

#include<stdio.h>
using namespace std;
int main() 
{
	int a[100001] = { 0 }, n, t, flag = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) 
	{
		scanf("%d", &t);
		a[t]++;
		if (a[t] > 1)
			flag = 1;
	}
	if (flag)
		printf("YES");
	else 
	    printf("NO");
	return 0;
}

2.PTA实验作业

2.1删除重复的字符

#include<bits/stdc++.h>
using namespace std; 
int main()
{ 
	int hash[128]={0}; 
	for(char ch=getchar();ch!='
';ch=getchar()) 
	  hash[ch]++; 
	for(int i=0;i<128;i++) 
	  if(hash[i]) 
	    cout<<char(i); 
	return 0;
}

2.2找鞍点


#include <stdio.h>
int main()
{
    int flag, i, j, hang, lie, n;
    int a[6][6];
    int repeat, ri;
 
    scanf("%d", &repeat);
 
    for(ri = 1; ri <= repeat; ri++){
      scanf("%d",&n);
      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
     
      hang=0; lie=0; flag=0;
      for(i=0;i<n;i++){
      for(j=0;j<n;j++)
            if(a[i][j]>=a[i][lie] && j!=lie)  lie=j; /*有并列极值元素,最后一个是鞍点*/
         flag=1;
         for(hang=0;hang<n;hang++){
               if(a[hang][lie]<a[i][lie]){
                        flag=0;
                        break;
                }
        }
         if(flag) break;
      }
 
      if(flag)      printf("%d %d",i,lie);
      else          printf("NONE");
      return 0;
}
}

2.3切分表达式

#include<iostream>
using namespace std;
int main()
{
    string str;
    cin>>str;
    for(int i=0;i<str.length();i++){
        printf("%c",str[i]);
        if(str[i]>='0'&&str[i]<='9'){
            if(str[i+1]<'0'||str[i+1]>'9'){
                if(str[i+1]!='.'){
                    printf("
");
                }
            }
        }else if(str[i]=='*'||str[i]=='/'){
            printf("
");
        }else if(str[i]==')'||str[i]=='('){
            printf("
");
        }else if(str[i]=='+'||str[i]=='-'){
            if(str[i-1]!='('&&i!=0){
                printf("
");
            }
        }
        
    }
    
    
    return 0;
}
原文地址:https://www.cnblogs.com/rryy2001/p/14156628.html