删除数组中指定的数字
- 输入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};
- 用前后两个指针,一个指向
a[0]
,一个指向a[1]
,比较两个的值 - 相等就用
a[2]
覆盖a[1]
的值,同时数组长度减一。 - 不相等就往后走,两个指针就都往前走一步。
- 如果前面的指针和后面的指针比较又相等,则重复第二步。直至数组结束。
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”,递归实现的大概原理:
- 交换a和g,
- 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
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;
}