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 sum聚合函数和if()函授的联合使用
今天去面试遇到一个数据库试题,首先说一下表结构如下: 表结构:mytest 表数据:mytest 要查询的结果如下: 在本题目中,需要用到sum聚合函数和if函数 sql如下: ,)) ,)) AS ...
- Python接口测试之封装requests
首先安装requests库: pip install requests test_requests.py 首先在TestRequest类中封装get与post方法, import requests i ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- Monkey官方帮助翻译&介绍
都说想学好就看原文,英文不好为了翻译这个可费了大劲了.表格从GOOGLE官网复制到WORD里编辑,结果贴上来格式全乱了,只得不弄表格了.表格中官网的事件不是最新的,比最新的少2个,具体我会另发一篇文章 ...
- 前端应该掌握的CSS实现多列等高布局
1.引言 我们在写页面的时候,有的时候会遇到多栏布局,每个栏目里面的内容有的时候可能不一样,这样就会导致每个栏目实际的高度也是不一样的,如果每个栏目有背景颜色的,就会导致每个栏目的底部是对不齐的,用户 ...
- [python][django学习篇][6]操作数据库
查询(取)数据 >>> Category.objects.all() <QuerySet [<Category: Category object>]> > ...
- zookeeper 集群
集群步骤: 1.安装zookeeper 2.修改zookeeper配置文件 3.创建myid文件 安装zookeeper:查看安装步骤 修改zookeeper配置文件:在zoo.cfg中添加配置 se ...
- 使用xcache加速PHP运行
XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编 ...
- 【Luogu】P2824排序(二分答案+线段树排序)
题目链接 震惊!两个线段树和一个线段树竟是50分的差距! 本题可以使用二分答案,二分那个位置上最后是什么数.怎么验证呢? 把原序列改变,大于等于mid的全部变成1,小于mid的全部变成0,之后线段树排 ...
- hdoj 1175 连连看
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...