Linux基础day4,shell编程,感觉比较经典的:删除字符串中重复字符

Linux基础,第四天

课程内容:shell基础


文件清单:
shiyan1.sh:第一期讲义实验6.1,使用test测试编写unload程序,达到文件卸载的功能
shiyan2.sh:编写脚本查看当前目录下文件属性(是普通文件还是目录)
shiyan3.sh:实现文件的备份,恢复,和卸载功能。

zuoye1.c:1.编写一个函数,作用是把一个字符串循环右移n个位。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”

zuoye2.c:2.本程序实现将一个字符串中重复的字符删掉,如输入abcddeab,则输出因为abcde。

shell的程序没啥感觉,基本感觉就是命令的集合,不过shell的函数还有点不懂,参数和返回值没弄明白,空了得看看。

zuoye1.c:

//1.编写一个函数,作用是把一个字符串循环右移n个位。
//比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
#include<stdio.h>
#include<string.h>
void swap(char * str,int n);
int main (int argc, char *argv[])
{
char str[] = "abcdefg";
int n=2;

puts(str);
swap(str,n);
puts(str);

return 0;
}
void swap(char str[],int n)
{
int len = strlen(str);
int i,j;
char temp;
for(i=0;i<n;i++)
{
temp = *(str+len-1);
for(j=len-1;j>0;j--)
{
*(str+j) = *(str+j-1);
}
*str = temp;
}
}

主要思想就是先把最后一位保存起来,然后前面的全部向后移一位,然后再把保存的最后一位覆盖第0位,就实现了一次移动。

zuoye2.c:

//2.本程序实现将一个字符串中重复的字符删掉,
//如输入abcddeab,则输出因为abcde。


#include<stdio.h>
#include<string.h>
#include<stdbool.h>
void delerepeat(char str[]);
int main (int argc, char *argv[])
{
char str[] = "abcdabcdefgg";

puts(str);
delerepeat(str);
puts(str);

return 0;
}
void delerepeat(char str[])
{
bool arry[128] = {0};    //新建一个数组来存放,128是ASIC码的最多,这个可以改小,只用字母字符的数量,然后减字母字符'A',
int i=0;
while(*(str+i))
{
if(arry[*(str+i)] == 0) //第一次遇到该字符
{
arry[*(str+i)] = 1;
i++;   //移位只在这里移动,后面的删除了一个就不用移位了
}
else      //如果当前位是1,就删除该字符,并链接
{
*(str+i) = 0;
strcat(str,str+i+1);
}

}

return;
}

感觉这道题比较经典,空间和时间的概念,用空间争取时间。主要思想就是用数组,下标为当前字母字符的值,遍历,遇到当前下标值为0,意思就是当前字母字符没重复,并置位当前下标数组元素。继续遍历,如果遇到下标值为1,意思就是前面已经遇到过,当前字母字符应该删除,然后把当前字母字符改为‘\0’,用strcat函数拼接上两个字符串,达到删除该字母字符和链接两个字符串的目的。

猜你喜欢

转载自blog.csdn.net/mjfmjj/article/details/16865905