反转算法

1、数组反转

如:{124}反转后的数组为{321}

算法描述:将第1个数和第n个数替换,第2个数和第n-1个元素替换,直到左边元素索引大于右边。

private static void reverseArr(int[] arr) {
	for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
	}
}

2、单个字母反转

如:“2hello”反转后为“olleh2

算法1:使用StringBuilder将其加入容器,在进行反转。

算法2:将该字符串转成字符数组,然后使用上面介绍的数组反转方法对字符数组进行反转,最后使用String的构造函数将字符数组转成字符串。

算法1的代码如下:

private static void reverseSingleStr1(String str) {
	StringBuilder sb = new StringBuilder();
	sb.append(str);
	sb.reverse();
}

算法2代码:

private static void reverseSingleStr2(String str) {
	//不用sb.reverse()方法实现
	char[] arr = str.toCharArray();
	System.out.println(arr);

	for (int i = 0, end = arr.length - 1; i < end; i++, end--) {

		char temp = arr[i];
		arr[i] = arr[end];
		arr[end] = temp;
		System.out.println(arr[i]+":"+arr[end]);
	}
	System.out.println(new String(arr));
}

3、多个字母反转 -句子反转

如:将"how are you? i am fine, thanks!"逆序输出->"!thanks ,fine am i ?you are how"

算法:将其转换成字符串数组,在逆序将字符串加入容器,期间需对每个字符串的字符判断是否有特殊字符, 有的话将该字符放到该单词的前面.

private static void reverseStrings() {

	String sentence = "how are you? i am fine, thanks!";
	String[] str = sentence.split(" ");
	StringBuilder sb = new StringBuilder();
	sb.append("\"");
	for (int i = 0; i < str.length; i++) {
		String s = str[str.length - 1 - i];// 倒序取单词
		if (i != str.length - 1) {

			char[] arr = s.toCharArray();
			int j = arr.length - 1;
			// 判断每个字符串的最后一个元素是否是字母
			if ((arr[j] >= 'a' && arr[j] <= 'z')
					|| (arr[j] >= 'A' && arr[j] <= 'Z')) {
			} else {
				// 不是字母
				s = arr[j] + s.substring(0, j);
			}
			sb.append(s + " ");
		} else {// 第一个元素
			sb.append(s);
		}
	}
	sb.append("\"");
	System.out.println(sb.toString());
}

4、整数反转

算法:模十取余法,每次取该整数的最低位,每取一次舍去最低位,直到该整数等于0

private static void reverseInt(int num) {
	int sum = 0;
	while (num != 0) {
		int d = num % 10;
		sum = sum * 10 + d;
		num /= 10;// 每取模一次,该整数最后一位去掉
	}
	System.out.println(sum);
}

 

#include <stdio.h> #include <stdlib.h> #define ERROR -1 #define OK 1 //定义单链表 typedef char ElemType; typedef struct LNode // 结点类型定义 { ElemType data; struct LNode * next; }LNode, *LinkList;//LinkList为结构指针类型 //定义关于单链表的若干操作 //初始化--建空表 void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; } //尾插法建表 void create_tail(LinkList *L, int n) { LNode *p, *last; int i; last=(*L); for(i=1; i<=n; i++) { p=(LNode *)malloc(sizeof(LNode)); //产生一个新结点 fflush(stdin); //清空内存 scanf("%c", &p->data); //往新结点的数据域中存入元素 last->next=p; //将新结点接在最后一个结点的后面 last=p; //新结点成为最后一个结点 } last->next=NULL; } //求单链表的长度 int ListLength(LinkList L) { LNode *p; int length; p=L->next; //p指针指向第一个元素所在的结点 length=0; //用来存放单链表的长度 while( p!=NULL ) //结点存在 { p=p->next; //p指针向后移 length++; //个数增加1个 } return length; } //求特定元素的个数 int Count(LinkList L, ElemType x) { LNode *p; int length; p=L->next; //p指针指向第一个元素所在的结点 length=0; //用来计算特定元素的个数 while( p ) //结点存在 { if( p->data ==x) //如果找到特定元素,则个数加1 length ++; p=p->next; //p指针向后移 } return length; } //在第i个元素前插入 int ListInsert_L(LinkList *L, int i, ElemType e) { LNode *p, *s; int j; p=(*L); j=0; while( p &&j<i-1) //如果当前结点存在,且移动次数未达到所需次数(找第i-1个结点) { p=p->next; j++; } if(!p || j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode)); //产生一新结点 s->data=e; //往新结点中存入元素 s->next=p->next; p->next=s; //新结点接在p结点之后 return OK; } //删除第i个元素 int ListDelete_L(LinkList *L, int i, ElemType *e) { LNode *p,*q; int j; p=(*L); j=0; while(p->next && j<i-1)//(找第i-1个元素)如果当前结点的下一个结点存在,且移动次数未达到所需次数 { p=p->next; j++; } if(!p->next || j>i-1) return ERROR; q=p->next; p->next=q->next; *e=q->data; free(q); //释放要删除的结点 return OK; } void reverse(LinkList *L) { LNode *p,*q,*r; p=(*L)->next; q=p->next; r=q->next; p->next=NULL; while(q!=NULL) { q->next=p; (*L)->next=q; p=q; q=r; if(r!=NULL) r=q->next; else break; } } void main() { LinkList list1; InitList(&list1); create_tail(&list1, 5); LNode *p; for(p=list1->next; p; p=p->next ) printf("%c ",p->data ); printf("\n"); /* printf("\n========================================\n"); printf("\n单链表的长度:%d\n", ListLength(list1)); printf("\n========================================\n"); printf("单链表中元素c的个数:%d\n", Count(list1, 'c')); printf("\n========================================\n"); ListInsert_L(&list1, 3, 'g'); printf("在第3个元素前插入元素g后,单链表中的元素有:\n"); for(p=list1->next; p; p=p->next ) printf("%c ",p->data ); printf("\n"); printf("\n========================================\n"); ElemType e; ListDelete_L(&list1,4, &e); printf("删除第4个元素后,单链表中的元素有:\n"); for(p=list1->next; p; p=p->next ) printf("%c ",p->data ); printf("\n"); printf("删除掉的元素是:%c\n",e); */ reverse(&list1); for(p=list1->next; p; p=p->next ) printf("%c ",p->data ); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值