Given an integer, write a function to determine if it is a power of two.
----------------------------------------------------------------------
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return !(n & (n - 1));
}
};
Implement Queue using Stacks
Implement the following operations of a queue using stacks.
- push(x) -- Push element x to the back of queue.
- pop() -- Removes the element from in front of queue.
- peek() -- Get the front element.
- empty() -- Return whether the queue is empty.
- You must use only standard operations of a stack -- which means only
push to top,peek/pop from top,size, andis emptyoperations are valid. - Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
- You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).
只有当output stack为空时,才会将input里的数全部压入output,抄的
class Queue {
public:
// Push element x to the back of queue.
void push(int x) {
input.push(x);
}
// Removes the element from in front of queue.
void pop(void) {
peek();
output.pop();
}
// Get the front element.
int peek(void) {
if (output.empty()) {
while (!input.empty()) {
output.push(input.top());
input.pop();
}
}
return output.top();
}
// Return whether the queue is empty.
bool empty(void) {
return input.empty() && output.empty();
}
private:
stack<int> input;
stack<int> output;
};
Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
----------------------------------------------- Could you do it in O(n) time and O(1) space?
找到中点,翻转其中一半,再比较
slow是中点(odd number)或者是后半部分的启示(even)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head == NULL) return true;
ListNode *fast = head, *slow = head;
while (fast != NULL) {
fast = fast->next;
if (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
}
// reverse the second half
ListNode *newHead = NULL;
while (slow != NULL) {
ListNode *temp = slow->next;
slow->next = newHead;
newHead = slow;
slow = temp;
}
while (newHead != NULL) {
if (newHead->val != head->val) return false;
newHead = newHead->next;
head = head->next;
}
return true;
}
};
Number of Digit One
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
Hint:
- Beware of overflow.
对每一位上的1可能出现的次数进行统计
ref:http://blog.csdn.net/xudli/article/details/46798619
class Solution {
public:
int countDigitOne(int n) {
int rt = 0;
for (long long i = 1; i <= n; i *= 10) {
int left = n / i;
int right = n % i; // 当前位之后的数
int cur = left % 10; // 当前位上的数
left /= 10; // 当前位之前的数
if (cur == 0) {
rt += left * i;
}else if (cur == 1) {
rt += left * i + right + 1;
}else {
rt += (left + 1) * i;
}
}
return rt;
}
};
No comments:
Post a Comment