Careercup | Chapter 1
1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structures?
字符串问题,需要先确定是不是只有ASCII码。
如果是,可以用char[256],也可以用位向量。位向量的实现参照《编程珠玑》。i&MASK就是取余。i>>SHIFT就是取商。
class BitVector {
public:
BitVector(int n) {
arr = new int[ + n / INT_LEN];
memset(arr, , ( + n / INT_LEN) * sizeof(int));
}
~BitVector() {delete[] arr;}
void set(int i) {
arr[i >> SHIFT] |= ( << (i & MASK));
}
void clear(int i) {
arr[i >> SHIFT] &= ~( << (i & MASK));
}
bool isSet(int i) {
return (arr[i >> SHIFT] & ( << (i & MASK)));
}
private:
int* arr;
enum {INT_LEN = , SHIFT = , MASK = 0x1f};
};
bool unique(char *p) {
bool ch[];
memset(ch, false, sizeof(bool) * );
while (*p) {
if (ch[*p]) return false;
ch[*p] = true;
p++;
}
return true;
}
bool unique2(char *p) {
BitVector bv();
while (*p) {
if (bv.isSet(*p)) return false;
bv.set(*p);
p++;
}
return true;
}
1.2 Implement a function void reversefchar* str) in C or C++ which reverses a null-terminated string.
void reverse(char* str) {
if (str == NULL) return;
int n = strlen(str);
int i = , j = n - ;
while (i < j) {
swap(str[i], str[j]);
i++;
j--;
}
}
1.3 Given two strings, write a method to decide if one is a permutation of the other。
忘了一点,就是要先确认是不是case sensitive和whitespace significant。
bool isPerm(char* s1, char* s2) {
int n1 = strlen(s1), n2 = strlen(s2);
if (n1 != n2) return false;
sort(s1, s1 + n1);
sort(s2, s2 + n2);
return strcmp(s1, s2) == ;
}
bool isPerm2(char* s1, char* s2) {
int ch[];
memset(ch, , sizeof(int) * );
while (*s1) ch[*s1++]++;
while (*s2) {
if (--ch[*s2++] < ) return false;
}
return true;
}
1.4 Write a method to replace all spaces in a string with '%20'. You may assume that the string has sufficient space at the end of the string to hold the additional characters, and that you are given the "true" length of the string.
char* replaceSpace(char* str) {
int b = ;
char *p = str;
while (*p != '\0') if (*p++ == ' ') b++;
char *np = p + (b << );
while (p >= str) {
if (*p == ' ') {
*np-- = '';
*np-- = '';
*np-- = '%';
} else {
*np-- = *p;
}
p--;
}
return str;
}
如果最左和最右的空格不需要替代,那么情况就会复杂一些,不能in place地实现了。
写的有点乱。
char* replaceSpace2(char* str) {
char *p = str;
while (*p && *p == ' ') p++;
if (!*p) return str;
str = p;
int b = , n = ;
char *t;
while (*p) {
if (*p != ' ') {
n++;
t = p;
} else b++;
p++;
}
b -= (p - t - );
n += b;
char * newstr = new char[n + b * ];
p = newstr;
for (int i = ; i < n; ++i) {
if (str[i] == ' ') {
*p++ = '%';
*p++ = '';
*p++ = '';
} else {
*p++ = str[i];
}
}
*p = '\0';
return newstr;
}
1.5 Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2blc5a3. If the "compressed" string would not become smaller than the original string, your method should return the original string.
careercup上的code是O(n)时间复杂度和O(n)空间复杂度。另外就是不用stringbuffer的字符串拼接的开销是O(n^2)。
int digits(int n) {
int i = ;
while (n > ) {
n /= ;
i++;
}
return i;
}
int int2str(int n, char *s) {
int i = ;
while (n > ) {
s[i++] = n % + '';
n /= ;
}
int k = , m = i - ;
while (k < m) {
swap(s[k], s[m]);
k++;
m--;
}
return i;
}
char* compress(char* str) {
if (str == NULL) return str;
char *p = str;
int n1 = , n2 = , n;
while (*p) {
char *t = p;
while (*p && *p == *t) p++;
n = p - t;
n1 += n;
n2 += + digits(n);
}
if (n2 >= n1) return str;
cout << n2 << endl;
char *s = new char[n2];
int i = ;
p = str;
while (*p) {
char *t = p;
while (*p && *p == *t) p++;
n = p - t;
s[i++] = *t;
i += int2str(n, s + i);
}
s[i] = '\0';
return s;
}
1.6 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?
Leetcode有,点此。
1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are set to 0.
Leetcode有,点此。
1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check If s2 is a rotation of s1 using only one call to isSubstring (e.g., "waterbottLe" is a rotation of "erbottLewat").
如果s2是s1旋转而来的,那么s1和s2的长度一定相同,s2一定是s1+s1的子串。反过来亦然。
原命题很显然。逆命题证明如下:
假设s1和s2长度相同,s2是s1+s1的子串。假设s1+s1=x+s2+y,令s2=m+n,使得len(x)+len(m)=len(s1),那么s1+s1=x+m+n+y;
于是有x+m=n+y=s1;且len(y)=len(s1)-len(n)=len(s2)-len(n)=len(m)。同理可证len(x)=len(n)。
因为len(y)=len(m),len(x)=len(n),x+m=n+y=s1,所以有x=n,y=m。于是s1=x+m=x+y,s2=m+n=y+x。所以s2是s1旋转而来的。
bool isRotate(string s1, string s2) {
if (s1.length() != s2.length()) return false;
string s1s1 = s1 + s1;
return (s1s1.find(s2) != string::npos); //isSubstring
}
Careercup | Chapter 1的更多相关文章
- Careercup | Chapter 3
3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...
- Careercup | Chapter 2
链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...
- Careercup | Chapter 8
8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...
- Careercup | Chapter 7
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- CareerCup Chapter 9 Sorting and Searching
9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. ...
- CareerCup chapter 1 Arrays and Strings
1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...
- CareerCup Chapter 4 Trees and Graphs
struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...
- Careercup | Chapter 6
6.2 There is an 8x8 chess board in which two diagonally opposite corners have been cut off. You are ...
- Careercup | Chapter 5
5.1 You are given two 32-bit numbers, N andM, and two bit positions, i and j. Write a method to inse ...
随机推荐
- Mysql存储过程中的事务回滚
create procedure test(in a int) BEGIN ; ;-- 异常时设置为1 START TRANSACTION; ,); ,); THEN ROLLBACK; ELSE C ...
- HDU 3333 Turing Tree 莫队算法
题意: 给出一个序列和若干次询问,每次询问一个子序列去重后的所有元素之和. 分析: 先将序列离散化,然后离线处理所有询问. 用莫队算法维护每个数出现的次数,就可以一边移动区间一边维护不同元素之和. # ...
- leetcode 【 Trapping Rain Water 】python 实现
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- C语言编程题002
给出两个整数,L和R,其中L<=A<=B<=R,然后求出A^B值最大的数.其中1<=L<=R<=1000. 比如说L = 1;R = 3; L 0001 R 001 ...
- php伪随机数漏洞 以及脚本php_mt_seed的使用教程
前几天在群里看到了一个题目,发现自己没有接触过这个伪随机数这个漏洞,在此记录下. 搜索这两个函数 mt_scrand() mt_rand() mt_scrand(seed)这个函数的意思,是通过分发s ...
- vim中插入递增数
假设生成0-9的递增数 1.插入数字1,yy复制,9p 2.输入命令 let i= | g//s//\=i/ | let i=i+1 3.结果:
- 体验devstack安装openstack
由于公司制度,工作环境是不能直接上网的,所以在工作时间从没有体验过devstack或者其他联网方式安装openstack. 因自己购置了一台不错的主机,因而决定尝试安装一番,经过一段为期不短的内心极度 ...
- 树中两个结点的最低公共祖先--java
题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点. 解析:对于任意一棵树,显然并不局限于二叉树,也就是说树的非叶子结点可能存在多个子节点.所以,我们可以定义两个链表结构,存储这 ...
- phpstrom换行的一个小坑
安装phpstrom后汉化会默认不是左边定格换行,而是会智能换行 苦找了许久了,终于知道在哪设置了,跟大家分享一下,希望不要走同样的坑 不勾选即可
- 【bzoj1095】[ZJOI2007]Hide 捉迷藏 动态点分治+堆
题目描述 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这 ...