快慢指针
class Solution {
public ListNode middleNode(ListNode head) {
ListNode p=head;
ListNode q=head;
while(q!=null&&q.next!=null){
q=q.next.next;
p=p.next;
}
return p;
}
}
环形链表->快慢指针+ 逻辑计算:首先快慢指针确定是否有环,此时快慢指针位置一定在环中,我们可以再定义一个头指针,然后与慢指针位移,相同则为入口;
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while (true) {
if (fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
if (fast == slow) break;
}
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
动态规划思想:
首先确定当下买入的最小值和最小利润,然后每过一天去顶当天买入的股票与昨天的差与之前我们的最小利润作对比得到最大利润;
并且每天得到相比之前最小的买入值
class Solution {
public int maxProfit(int[] prices) {
if(prices.length <= 1)
return 0;
//记录之前买入的最小值和利润
int min = prices[0], max = 0;
//计算利润,今天卖出的-之前买入的值,与之前利润比较
//并且比较每天的买入大小
for(int i = 1; i < prices.length; i++) {
max = Math.max(max, prices[i] - min);
min = Math.min(min, prices[i]);
}
return max;
}
}
首先分为大写和小写两种,然后将字符串中字符添加进去,每出现一次,对应位置值++
统计次数:如果为偶数次,+sum,如果为奇数则不计,在最后判断长度,看是奇数还是偶数长度再判断是否+1;
class Solution {
public static int longestPalindrome(String s) {
int[] cap = new int[26];
int[] low = new int[26];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a') {
low[c - 'a']++;
} else {
cap[c - 'A']++;
}
}
int sum = 0;
for (int i = 0; i < 26; i++) {
if (cap[i] % 2 == 0) {//说明该位置上的数为偶数次出现
sum += cap[i];
} else {
sum += (cap[i]-1);
}
if (low[i] % 2 == 0) {
sum += low[i];
} else {
sum += (low[i]-1);
}
}
// 全是成双的
if (sum == s.length())
return sum;
else
// 单加一个放中间
return sum+1;
}
}