zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Eclipse正确导入第三方project
    面试的基础_01字符串反向操作
    一个简单的实现了智能虚拟女友—图灵机器人
    Notepad++去除代码行号的几种方法
    fastjson将bean转成字符串时首字母变小写问题
    2015第34周二能收发邮件但不能打开网页解决方法
    2015第34周一
    2015第33周日
    2015第33周六
    构建自己的顾问团
  • 原文地址:https://www.cnblogs.com/rryy2001/p/14156628.html
Copyright © 2011-2022 走看看