数组去重 删除指定的值 递归逆序输出字符串的元素

删除数组中指定的数字

  • 输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

更新数组下标及其对应的值,相等就不更新往后走。

#include <stdio.h>
int main()
{
    int n = 0;
    int arr[50] = {0};
    int del = 0;
    scanf("%d", &n);
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &del);   要删除的元素 
    int j = 0;
    for(i=0; i<n; i++)
    {
        if(arr[i] != del)   
        {
            arr[j++] = arr[i]; 把重复的过滤掉		1 2 3 3 4 5 
        }  等于更新a数组的下标对应的值。 1 2 3 4 5  
       最终 j 的值就是数组的长度。
    } 												
    for(i=0; i<j; i++)
    {
        printf("%d ", arr[i]);    
    }
    return 0;
}

数组去重

输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。不知道这个数出现几次,也不知道有几个数重复。

  • 假设数组a[]={3,2,3,3,3,4,5};
  1. 用前后两个指针,一个指向a[0],一个指向a[1],比较两个的值
  2. 相等就用a[2]覆盖a[1]的值,同时数组长度减一。
  3. 不相等就往后走,两个指针就都往前走一步。
  4. 如果前面的指针和后面的指针比较又相等,则重复第二步。直至数组结束。
int main()
{
	int arr[1000] = { 0 };
	int i = 0;
	int n = 0;
	scanf("%d", &n);
	for ( i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int j = 0;
	for ( i = 0; i < n; i++)
	{
		for ( j = i+1; j < n; j++)
		{
			int m = 0;
			if (arr[i] == arr[j])
			{
				下一位的数字依次往前挪
				for ( m = j; m < n-1; m++) //因为m就是i+1位,把i+2的值赋给它
		当m取到3的时候,已经把第四位的值给它了。
				{
					arr[m] = arr[m + 1];
				}
				出来的时候要把数组长度减一。j也减减
				n--;
				j--;以防arr[j+1]和arr[j]相等。
			}
		}
	}
	for ( i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

用递归的方法逆序输出字符串的元素

对于字符串“abcdefg”,递归实现的大概原理:

  1. 交换a和g,
  2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
void reverse_string(char* arr)
{
	int len = strlen(arr); 每次进来求字符串长度
	char tmp = *arr;   
	每次进来将arr第一个元素交给临时变量
	*arr = *(arr+len-1);   
	将最后一个元素赋值给第一个元素
	*(arr+len-1) = '\0';   
	将最后一个元素置成'\0'
	if(len >= 2)   		   
	字符串只剩一个元素的时候就不用再递归了。 										
		reverse_string(arr+1);
				
	*(arr+len-1) = tmp;    
}

第一次

第二次
第三次
第四次开始出栈 出栈意味每次出去都会更新首元素,然后将tmp的值一次赋值给新出来的字符串的最后一位。
在这里插入图片描述
在这里插入图片描述
出栈2
出栈3
出栈4
出栈5
在这里插入图片描述
在这里插入图片描述

GG.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值