快慢指针
141.环形链表
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null||head.next==null){
return false;
}
ListNode fast=head;
ListNode slow=head;
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(fast==slow){
return true;
}
}
return false;
}
}
876.链表中间节点
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
}
56 合并区间
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res=new ArrayList<>();
if(intervals.length==0||intervals==null) return res.toArray(new int[0][]);
Arrays.sort(intervals,(a,b)->a[0]-b[0]);
for(int i=0;i<intervals.length;i++){
int left=intervals[i][0];
int right=intervals[i][1];
while(i<intervals.length-1&&intervals[i+1][0]<=right){
i++;
right=Math.max(right,intervals[i][1]);
}
res.add(new int[] {left,right});
}
return res.toArray(new int[0][]);
}
}
14.最长公共前缀
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0) return "";
String ans=strs[0];
for(int i=1;i<strs.length;i++){
int j=0;
for(;j<strs[i].length()&&j<ans.length();j++){
if(ans.charAt(j)!=strs[i].charAt(j))
break;
}
ans=ans.substring(0,j);
if(ans.equals("")){
return ans;
}
}
return ans;
}
}
763.划分字母区间
class Solution {
public List<Integer> partitionLabels(String S) {
ArrayList<Integer> result = new ArrayList<>();
if (S == null || S.length() <= 0) {
return result;
}
/*
填充 lastIndex数组
*/
int[] lastIndex = new int[26]; // 存储 一个字母 的 最后一次出现下标
Arrays.fill(lastIndex, -1);
int length = S.length();
for (int i = 0; i < length; i++) {
lastIndex[S.charAt(i) - 'a'] = i;
}
/*
计算 结果数组
*/
int startIndex = 0;
int endIndex = 0;
for (int i = 0; i < length; i++) {
endIndex = Math.max(endIndex, lastIndex[S.charAt(i) - 'a']); // 取出当前最大的 最后一个下标
if (i == endIndex) { // 若 相等,则之前的所有元素,都仅在 i之前出现,可以记录结果
result.add(endIndex - startIndex + 1);
startIndex = endIndex + 1;
}
}
return result;
}
}
数字操作
7.整数反转
class Solution {
public int reverse(int x) {
int ans=0;
while(x!=0){
int pop=x % 10;
if(ans>Integer.MAX_VALUE/10||(ans==Integer.MAX_VALUE/10&&pop>7)) return 0;
if(ans<Integer.MIN_VALUE/10||(ans==Integer.MIN_VALUE/10&&pop<-8)) return 0;
ans=ans*10+pop;
x/=10;
}
return ans;
}
}
8.字符串转整数
class Solution {
public int myAtoi(String s) {
char[] chars=s.toCharArray();
int len=chars.length;
int i=0;
while(i<len && chars[i]==' '){
i++;
}
if(i==len) return 0;
Boolean negative=false;
if(chars[i]=='-'){
negative=true;
i++;
}
else if(chars[i]=='+'){
negative=false;
i++;
}else if(!Character.isDigit(chars[i])){
return 0;
}
int ans=0;
while(i<len && Character.isDigit(chars[i])){
int digit=chars[i]- '0';
if(ans>(Integer.MAX_VALUE-digit)/10){
return negative?Integer.MIN_VALUE:Integer.MAX_VALUE;
}
ans=ans*10+digit;
i++;
}
return negative?-ans:ans;
}
}
9.回文数
class Solution {
public boolean isPalindrome(int x) {
if(x<0) return false;
int ans=0;
int temp=x;
while(temp!=0){
int pop=temp%10;
ans=ans*10+pop;
temp/=10;
}
if(ans==x)
return true;
else return false;
}
}
43.字符串相乘
class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")) return "0";
int[] res=new int [num1.length()+num2.length()];
for(int i=num1.length()-1;i>=0;i--){
int a=num1.charAt(i)-'0';
for(int j=num2.length()-1;j>=0;j--){
int b=num2.charAt(j)-'0';
int sum=res[i+j+1]+a*b;
res[i+j+1]=sum%10;
res[i+j]+=sum/10;
}
}
StringBuilder str=new StringBuilder();
for(int i=0;i<res.length;i++){
if(i==0&&res[i]==0) continue;
str.append(res[i]);
}
return str.toString();
}
}
172.阶乘后的0
class Solution {
public int trailingZeroes(int n) {
int count = 0;
while (n > 0) {
count += n / 5;
n = n / 5;
}
return count;
}
}
258.个位相加
class Solution {
public int addDigits(int num) {
int temp=num;
while(true){
int x=temp/10;
int y=temp%10;
temp=x+y;
if(temp<10) break;
}
return temp;
}
}