javaSE之数组

== 现在有一个单向链表,谈一谈,如何判断链表中是否出现了环==

单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。
// 链表的节点结构如下 typedef struct node { int data; struct node *next; } NODE;
最常用方法:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。
通过使用STL库中的map表进行映射。首先定义 map<NODE *, int> m; 将一个 NODE * 指针映射成数组的下标,并赋值为一个 int 类型的数值。然后从链表的头指针开始往后遍历,每次遇到一个指针p,就判断 m[p] 是否为0。如果为0,则将m[p]赋值为1,表示该节点第一次访问;而如果m[p]的值为1,则说明这个节点已经被访问过一次了,于是就形成了环。

<mark>谈一谈,bucket如果用链表存储,它的缺点是什么?</mark>

①查找速度慢,因为查找时,需要循环链表访问

②如果进行频繁插入和删除操作,会导致速度很慢。

== 有一个链表,奇数位升序偶数位降序,如何将链表变成升序==



public class OddIncreaseEvenDecrease {

	/** * 按照奇偶位拆分成两个链表 */
	public static Node[] getLists(Node head) {
		Node head1=null;
		Node head2=null;
		Node cur1=null;
		Node cur2=null;
		int count=1;//用来计数
		while (head!=null) {
			if (count%2==1) {
				if (cur1!=null) {
					cur1.next=head;
					cur1=cur1.next;
				}else {
					cur1=head;
					head1=cur1;
				}
				
			}else {
				if (cur2!=null) {
					cur2.next=head;
					cur2=cur2.next;
				}else {
					cur2=head;
					head2=cur2;
				}
			}
			head=head.next;
			count++;
		}
		//跳出循环,记得最后两个末尾的下一个元素指向null
		cur1.next=null;
		cur2.next=null;
		Node[] nodes=new Node[] {head1,head2};
		return nodes;
	
	}
	/** * 反转链表 */
	public static Node reverseList(Node head) {
		Node pre=null;
		Node next=null;
		while (head!=null) {
			next=head.next;
			head.next=pre;
			pre=head;
			head=next;
			
		}
		return pre;
	}
	/** * 合并两个有序链表 */
	public static Node combineList(Node head1,Node head2) {
		
		if (head1==null||head2==null) {
			return head1!=null? head1:head2;
		}
		Node head=head1.val<head2.val? head1:head2;
		Node cur1=head==head1? head1:head2;
		Node cur2=head==head1? head2:head1;
		Node pre=null;
		Node next=null;
		while (cur1!=null&&cur2!=null) {
			//这里一定要有=,否则一旦cur1的value和cur2的value相等的话,
			//下面的pre.next会出现空指针异常
			if (cur1.val<=cur2.val) {
				pre=cur1;
				cur1=cur1.next;
			}else {
				next=cur2.next;
				pre.next=cur2;
				cur2.next=cur1;
				pre=cur2;
				cur2=next;
				
			}
		}
		pre.next=cur1==null? cur2:cur1;
		
		return head;
		
	}
	
}
class Node{
	Node next;
	int val=0;
	public Node(int val) {
		this.val=val;
	}
}

<mark>随机链表的复制</mark>

//随机链表的复制
	public RandomListNode copyRandomList(RandomListNode head) {
		  
	    if (head == null)
	        return null;
	  
	    RandomListNode p = head;
	  
	    // copy every node and insert to list
	    while (p != null) {
	        RandomListNode copy = new RandomListNode(p.label);
	        copy.next = p.next;
	        p.next = copy;
	        p = copy.next;
	    }
	  
	    // copy random pointer for each new node
	    p = head;
	    while (p != null) {
	        if (p.random != null)
	            p.next.random = p.random.next;
	        p = p.next.next;
	    }
	  
	    // break list to two
	    p = head;
	    RandomListNode newHead = head.next;
	    while (p != null) {
	        RandomListNode temp = p.next;
	        p.next = temp.next;
	        if (temp.next != null)
	            temp.next = temp.next.next;
	        p = p.next;
	    }
	  
	    return newHead;
	}

<mark>一个数组,除一个元素外其它都是两两相等,求那个元素?</mark>

 public static int find1From2(int[] a){
        int len = a.length, res = 0;
        for(int i = 0; i < len; i++){
            res= res ^ a[i];
        }
        return res;
}

<mark>找出数组中和为S的一对组合,找出一组就行</mark>

	//从数组中找出一对数和为S的一对数
	public int[] twoSum(int[] nums, int target) {
			        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
			        int[] a = new int[2];
			        map.put(nums[0], 0);
			        for (int i = 1; i < nums.length;i++) {
			            if (map.containsKey(target - nums[i])) {
			                a[0] = map.get(target -nums[i]);
			                a[1] = i;
			                return a;
			            } else {
			                map.put(nums[i], i);
			            }
			        }
			        return a;
			}

<mark>求一个数组中连续子向量的最大和</mark>

//求一个数组中连续子向量的最大和

public class FindGreatestSumOfSubArray {
	public int findGreatestSumOfSubArray(int[] array) {
		int sum = array[0];
		int max = array[0];
		
		for(int i = 1;i < array.length;i ++) {
			//前面sum大于0,认为是有贡献的,可以叠加在上面。否则认为没有贡献,另起炉灶
			if(sum >= 0) {
				sum = sum + array[i];
			}
			else {
				sum = array[i];
			}
			
			if(sum > max) {
				max = sum;
			}
		}
		
		return max;
	}


<mark>介绍一下,排序都有哪几种方法?请列举出来。</mark>

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),
归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t

全部评论

相关推荐

2025-11-21 22:25
门头沟学院 HTML5
我是个没天赋的人,努力学习也只考上了个一本,家里条件也不怎么样。大一玩了一年,没怎么学技术,也没有卷绩点,全在游戏小说抖音中度过。大二上接触了牛客,看到了许多优秀的同龄人。很多双非的同学,甚至不少学院本的同学都进了大厂实习。我把他们作为榜样,决定好好学习。我每天都至少学八九个小时,很多次都想要放弃,想哭,我都坚持了下来。我总是告诉自己,只要努力,就一定能有好的结果。这几个月过的很累,但也很充实。转眼就到大二下了,我决定去找实习了,但是学校的认可度让我感到心底发凉,明明和广工这种知名双非分差不多,结果总被问是不是公办本科。两个月投了一千份实习,只有四个面试,最终去了个中小厂实习。结果就是改了两个月bug,虽然mt人挺好,但是实在学不了什么东西,所以就离职开始面试。凭借这段实习,确实多了不少中小厂面试,但是大厂依旧没有面试机会。除了字节腾讯所有大厂都投了,结果依旧是0面试。最终有幸获得美团的面试机会,面试也幸运的通过,然后入职了。为了省钱坐十几个小时硬座到北京,到北京的第一天,由于太激动想要租房,结果被坑了2600,之前实习的地方,房东也故意不退押金,加起来总共损失3000多。虽然很难过,但是我还是忍受了下来,我想着实习才刚开始,会好起来的。实习了大半个月,跟学校这边沟通一直不成功,我每天都寝食难安,精神都快崩溃了,经常凌晨两三点才睡着,想要跳楼。最后迫于无奈,我一大早我坐高铁回去,恳求院主任给我一个机会,我怎么恳求讲理都没用,甚至都磕头下跪了,还是没用。院主任一点机会都没给我,连让我跟各科老师沟通机会都不给,要不休学要不辞职。我没得选择,这段实习我看的比我的生命还重要,这不仅是我这大半年的心血,更是未来的一份希望。我只能休学,我想着现在好好实习,多学点技术,到时候秋招早点拿到offer,然后再补这学期的课也不是不行。但是,现实总是事与愿违。这三个月说实话并没有学到什么东西,前一个月很闲,这两个月事很多,每天基本都是九点后下班,但都是杂活。产出都是靠我看文档加上代码写上去的。我真的很想锻炼一下技术,但是总是不尽人意。三个月了,我到现在都还没做过一个像样点的需求。产出是能编,但有破绽不说还没锻炼到技术。我好想真正的做一下需求啊,我好想真正的走完一遍流程,去上线一次啊。接下来两个月,我不知道该怎么坚持下去了,现在每天都想哭,很焦虑,很难受。冒着将来可能延毕的风险,我赌上了一切,结果输的这么彻底,可能我就只是个小丑吧。如果家庭好点就不用卷了,如果我聪明一点就能上个好学校了,如果大一有人带我,我就不会摆烂了,如果院主任给我个机会,我就不用这么苦了,如果我实习能有机会好好锻炼自己,我就不用这么难受焦虑了。但是没办法,我又能怎么办呢,无非是咬紧牙关罢了,毕竟没人能够帮助我,只能靠自己我可真是个小丑啊
HasonoCell:你很棒了bro....其实我看网上休学一年的人很多的也都顺利毕业了,真的不用特别焦虑这个事。另外实习也是,有一段大厂实习已经比很多很多人厉害了,跟你一届的很多人现在估计都没意识到未来的压力呢,实习就算没产出也不用特别焦虑,好好总结一下已经做过的事情,然后趁着休学这年继续冲一下,要相信未来会有好结果的。你应该也挺眼熟我的,我之前字节横向挂的时候也是难过的不行,觉得自己好没用,结果百度出乎意料的offer了,很多事其实都很顺其自然,认真做事,好结果也许就在下个路口等着你。 很喜欢的一句话是:木已成舟。不要老是沉浸在过去的遗憾中无法自拔噢,要努力过好当下。 好好休息一下吧,辛苦了,你已经很棒了噢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务