九、判断链表是否是回文链表
解法:O(N)\O(N)的解法。
class
Solution {
public
:
ListNode* temp;
bool
isPalindrome(ListNode* head) {
temp = head;
return
check(head);
}
bool
check(ListNode* p) {
if
(
NULL
== p)
return
true
;
bool
isPal = check(p->next) & (temp->val == p->val);
temp = temp->next;
return
isPal;
}
};
十、找出无序数组中出现次数大于n/2的数
解法一、用库函数
nth_element(nums.begin(), nums.begin() + nums.size() /
2
, nums.end());
public
:
int
majorityElement(
vector<
int
>
& nums) {
nth_element(nums.begin(), nums.begin() + nums.size() /
2
, nums.end());
return
nums[nums.size() /
2
];
解法三、
int major, counts = 0 , n = nums.size();
}
};
解法二、随机枚举(居然是最快的-_-)
class Solution {
class Solution {
public
:
int
majorityElement(
vector<
int
>
& nums) {
int
n = nums.size();
srand(
unsigned
(time(
NULL
)));
while
(
true
) {
int
idx = rand() % n;
int
candidate = nums[idx];
int
counts =
0
;
for
(
int
i =
0
; i < n; i++)
if
(nums[i] == candidate)
counts++;
if
(counts > n /
2
)
return
candidate;
}
}
};
class
Solution {
public
:
int
majorityElement(
vector<
int
>
& nums) {
int major, counts = 0 , n = nums.size();
for
(
int
i =
0
; i < n; i++) {
if (!counts) {
public
:
if (!counts) {
major = nums[i]; counts =
1
;
}
else
counts += (nums[i] == major) ?
1
: -
1
;
}
return
major;
}
};
十一、删除排序数组中重复的元素
class
Solution {
解法:遍历一遍,记录下已遍历的元素中重复的个数,把元素向前移动重复个数位置就行了。
int
removeDuplicates(vector<
int
>& nums) {
int
count =
0
;
for
(
int
i =
1
; i < nums.size(); i++){
if
(nums[i] == nums[i-
1
]) count++;
else
nums[i-count] = nums[i];
}
return
nums.size()-count;
}
};
解法:遍历一遍,统计每个单词的长度,若遇到空格则把前一个单词的长度置0.
public :
int
lengthOfLastWord(string s) {
int
len =
0
;
for
(
int
i =
0
;i < s.size();) {
if
(s[i++] != ' ') len++;
else if
(s[i] != '\
0
'&&s[i] != ' ') len =
0
;
}
return
len;
}
};
解法一:递归。
public :
TreeNode* invertTree(TreeNode* root) {
if
(!root)
return
root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return
root;
}
};
解法二:非递归。
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while
(!s.empty()) {
TreeNode* temp = s.top();
s.pop();
if
(temp) {
swap(temp->left,temp->right);
s.push(temp->right);
s.push(temp->left);
}
}
return
root;
}
};
解法:利用链表判环方法,快慢”指针“。Happy数最终会以1结束,非Happy数会无限循环,所以只需要判断是否出现环即可。
int
digitSquareSum(
int
n) {
int
sum =
0
, tmp;
while
(n) {
tmp = n %
10
;
sum += tmp * tmp;
n /=
10
;
}
return
sum;
}
bool
isHappy(
int
n) {
int
slow, fast;
slow = fast = n;
do
{
slow = digitSquareSum(slow);
fast = digitSquareSum(fast);
fast = digitSquareSum(fast);
if
(fast ==
1
)
return
1
;
}
while
(slow != fast);
return
0
;
}
};