CareerCup 150 (Cracking the Coding Interview)是由 Google 的前员工撰写的,一本针对程序员面试的攻略,其中囊括了许多 IT 巨头的面试流程。这本书的题目难度适中,不是很难,但是想要一次把代码写正确,却需要多多练习。
这本书盛名已久,我就不多介绍了,书中提供的解答是 Java 版本的,我自己喜欢用 C,所以在这里记录 C 语言版本的解答,希望和大家多多交流。
------------------------------- 1.1.c -----------------------
题目我就不在这里写了,网上到处都有的。
两种方法:一种是直接遍历,另一种是使用快排,边排序边找。
/* This is one of the solution set to CareerCup 150 problems.
*
* Problem 1.1
*
* Compile command: gcc 1.1.c -std=c99
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int straightWay(char *str); //O(n^2) time, O(n) space
void quicksort(char *str, int length); //O(nlogn) time, O(n) space
int main(int argc, char *argv[])
{
if(argc != 3)
{
printf("usage: <program name> <type<type 1:straightWay 2:quicksort> <string>\n");
return 1;
}
switch(atoi(argv[1]))
{
case 1:
if(straightWay(argv[2]))
printf("Dup.\n");
break;
case 2:
quicksort(argv[2], strlen(argv[2]));
break;
default:
printf("Wrong choice.\n");
break;
}
return 0;
}
int straightWay(char *str)
{
int i=0,j=0;
int len = (int)strlen(str);
while(i < len)
{
for(j=i+1; j < len; j++)
{
if(str[i] == str[j])
{
return 1;
}
}
i++;
}
return 0;
}
void quicksort(char *str, int length)
{
int low, high;
char pivot, tmp;
if (length < 2)
return;
pivot = str[0];
low = 0;
high = length;
for(;;)
{
while(str[++low] < pivot && low < length);
if(str[low] == pivot)
{
printf("Dup.\n");
return;
}
while(str[--high] > pivot);
if(low >= high)
break;
tmp = str[low];
str[low] = str[high];
str[high] = tmp;
}
tmp = str[low - 1];
str[low - 1] = str[0];
str[0] = tmp;
quicksort(str, low - 1);
quicksort(str + low, length - low);
}