编程问答
算法练习day19——190410(数组中重复的数字、替换空格、从尾到头打印链表) -凯发ag旗舰厅登录网址下载
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
要求复杂度为 o(n) o(1)【时间复杂度 o(n),空间复杂度 o(1)】
1.1 分析
这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上。
1.2 代码实现
public class duplicatenum {public static void main(string[] args) {int[] arr= {2,3,1,0,2,5};int n=arr.length;system.out.println(duplicate(arr,n));}public static int duplicate(int[] nums,int len) {if(nums==null||len<=0)return -1;int res=-1;for(int i=0;i将一个字符串中的空格替换成 " "。
2.1 分析
在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。
因为一个空格要替换成三个字符( ) ,因此当遍历到一个空格时,需要在尾部填充两个任意字符。
令 p1 指向字符串原来的末尾位置,p2 指向字符串现在的末尾位置。
p1 和 p2从后向前遍历,当 p1 遍历到一个空格时,就需要令 p2 指向的位置依次填充 02%(注意是逆序的) ,否则就填充上 p1 指向字符的值。
从后向前遍是为了在改变 p2 所指向的内容时,不会影响到 p1 遍历原来字符串的内容。
p1==p2时,结束。
2.1 代码实现
public class replacespace {public static void main(string[] args) {string string="a b c";system.out.println(replacespace(string));}public static string replacespace(string str) {stringbuffer sb=new stringbuffer(str);//便于使用append()int p1=str.length()-1;for(int i=0;i输入链表的第一个节点,从尾到头反过来打印出每个结点的值。
3.1 分析1——使用栈
使用栈存储遍历过的节点值。
3.2 代码实现1
package qian10;import java.util.arraylist; import java.util.stack;public class printlistreverse {static class node{node next;int value;public node(int value) {this.value=value;}}public static void main(string[] args) {node head=new node(1);head.next=new node(2);head.next.next=new node(3);head.next.next.next=new node(4);arraylist3.3 分析2——使用递归
使用递归实现
当前节点不为空,继续向后;为空,则将当前节点加入结果集,返回结果集。
使用addall方法将返回的arraylist中的所有数据全部加入到当前arraylist中。
3.4 代码实现2
public static arraylist注:原博
arraylist是一个实现可变长数组,继承abstractlist类,实现所有的list接口,还实现了randomaccess、cloneable、serializable接口。
add源代码:
public boolean add(e e) {ensurecapacityinternal(size 1);elementdata[size ] = e;return true; }addall源代码:
//将collection c内的数据插入arraylist中 public boolean addall(collection c) {object[] a = c.toarray(); int numnew = a.length;ensurecapacityinternal(size numnew);// increments modcountsystem.arraycopy(a, 0, elementdata, size, numnew);size = numnew;return numnew != 0; }//将collection c中的数据插入到arraylist的指定位置 public boolean addall(int index, collection c) {rangecheckforadd(index);object[] a = c.toarray();int numnew = a.length;ensurecapacityinternal(size numnew); // increments modcountint nummoved = size - index;if (nummoved > 0)system.arraycopy(elementdata, index, elementdata, index numnew,nummoved);system.arraycopy(a, 0, elementdata, index, numnew);size = numnew;return numnew != 0; }3.5 分析3——使用头插法
利用链表头插法为逆序的特点。
头结点和第一个节点的区别:
- 头结点是在头插法中使用的一个额外节点,这个节点不存储值;
- 第一个节点就是链表的第一个真正存储值的节点。
前两个节点的细节图如下所示(类似于链表反转):
3.6 代码实现
public static arraylist用反转链表的思想实现:
public static arraylist
总结
以上是凯发ag旗舰厅登录网址下载为你收集整理的算法练习day19——190410(数组中重复的数字、替换空格、从尾到头打印链表)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。
- 上一篇:
- 下一篇: 容器(collection/map)、容