文章目录
一、移除数组元素
题目链接


public static int removeElement(int[] nums,int val){
int slowIndex;
int fastIndex = 0;
for (slowIndex = 0;fastIndex<nums.length;fastIndex++){
if (nums[fastIndex]!=val){
nums[slowIndex++]=nums[fastIndex];
}
}
return slowIndex;
}
二、反转字符串

题目链接
public static void reverseString(char[] s) {
for (int i=0,j=s.length-1;i<s.length/2;i++,j--){
char c = s[i];
s[i]=s[j];
s[j]=c;
}
}
三、替换空格(剑指Offer)

题目链接
public static String replaceSpace(String s) {
if (s.length()==0){
return null;
}
StringBuilder ss = new StringBuilder();
for (int i=0;i<s.length();i++){
if (s.charAt(i)==' '){
ss.append(" ");
}
}
int left = s.length();
s+=new String(ss);
int right = s.length();
char[] chars = s.toCharArray();
while (left>=0){
if (chars[right]==' '){
chars[right--]='0';
chars[right--]='2';
chars[right]='%';
}else {
chars[right]=chars[left];
}
left--;
right--;
}
return String.valueOf(chars);
}
四、翻转字符串里的单词


题目链接
public static String reverseWords(String s) {
if (s==null){
return null;
}
String trim = s.trim();
StringBuilder str = new StringBuilder();
int left = trim.length()-1;
int right = trim.length()-1;
while (left>=0){
if (left>0&&' '==trim.charAt(left-1)){
str.append(trim.substring(left,right+1));
while (' '==trim.charAt(left-1)){
left--;
}
}else if (' '==trim.charAt(left)){
str.append(" ");
left--;
right=left;
}else if (left==0){
str.append(trim.substring(left,right+1));
left--;
}
else {
left--;
}
}
return new String(str);
}
五、翻转链表


题目链接
public static ListNode reverseList(ListNode head){
if (head==null){
return null;
}
ListNode cur = head;
ListNode temp;
ListNode resverNode = new ListNode();
ListNode pre = new ListNode();
pre.next = head;
while (cur!=null){
temp = cur.next;
cur.next = resverNode.next;
resverNode.next=cur;
cur=temp;
}
pre.next = resverNode.next;
return pre.next;
}
六、删除链表的倒数第n个结点

题目链接
双指针解题 设立两个指针,第一个指针向前移动n步,随后两个指针同时移动,当第一个指针到达末尾时,第二个指针刚好到达第n个位置
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode cur = head;
ListNode pre = new ListNode(-1);
pre.next = cur;
ListNode fast = head;
for (int i=0;i<n;i++){
fast = fast.next;
}
ListNode p = new ListNode();
while (fast.next!=null){
p=cur;
cur = cur.next;
fast = fast.next;
}
p.next = cur.next;
return pre.next;
}
七、链表相交



题目链接
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lengthA = getLinkedLength(headA);
int lengthB = getLinkedLength(headB);
ListNode curA = headA;
ListNode curB = headB;
if (lengthB>lengthA){
int temp = lengthA;
lengthA = lengthB;
lengthB = temp;
ListNode p = curA;
curA = curB;
curB = p;
}
int L = lengthA-lengthB;
for (int i=0;i<L;i++){
curA = curA.next;
}
while (curA!=null){
if (curA==curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
private int getLinkedLength(ListNode head) {
int length = 0;
ListNode cur = head;
while (cur!=null){
length++;
cur=cur.next;
}
return length;
}
八、环形链表


题目链接
public ListNode detectCycle(ListNode head) {
if (head==null){
return null;
}
ListNode fast = head;
ListNode slow = head;
while (fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if (fast==slow){
ListNode node = head;
while (node!=fast){
fast = fast.next;
node = node.next;
}
return node;
}
}
return null;
}
九、三数之和

题目链接
public static List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<>();
for (int i=0;i<nums.length-2;i++){
int left = i+1;
int right = nums.length-1;
while (left<right){
int value = 0-(nums[i]+nums[left]+nums[right]);
if (value==0){
list.add(Arrays.asList(nums[i],nums[left],nums[right]));
while (right>left&&nums[right]==nums[right-1]) right--;
while (right>left&&nums[left]==nums[left+1]) left++;
right--;
left++;
}else if (value>0){
right--;
}else{
left++;
}
}
}
return list;
}
十、四数之和

题目链接
public static List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<>();
if (nums==null||nums.length<4){
return list;
}
for (int i=0;i<nums.length-3;i++){
if (i>0&&nums[i]==nums[i-1]){
continue;
}
for (int j=i+1;j<nums.length-2;j++){
if (j-1>i&&nums[j]==nums[j-1]){
continue;
}
int left = j+1;
int right = nums.length-1;
while (left<right){
int value =(nums[i]+nums[j]+nums[left]+nums[right]);
if (value>target){
right--;
}else if (value<target){
left++;
}else {
list.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while (right>left&&nums[right]==nums[right-1]) right--;
while (right>left&&nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
}
return list;
}