在一个字符串中找到第一个只出现一次的字符

在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

题目不难,主要是两个条件,注意只出现一次,并且要第一个这种字符。

用stl的map什么的有点不合适,简单数组map即可。
char str_first(char* str)
{
char* ptr = str;
int map[255];
memset(map, 0, sizeof(int)*255);
// First O(N), count
while(*ptr!=[......]

继续阅读

约瑟夫环问题(数学解法)

约瑟夫环问题:每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。求出在这个圆圈中剩下的最后一个数字。

据说之前,这些数字是死囚,能抽到最后一个的人能活着……

模拟的方法弱爆了,有递推公式的,假设有n个人,每轮第k个人被杀掉,递推公式如下:

如果想知道推导过程,可以看维基百科:"Josephus problem"

即初始sum=0,我们从i=2开始(i就是上面公式的[......]

继续阅读

有序数组,求满足数字之和的两个数

原题是编程之美上的,数组无序。书上面的最优解法是先排序。。。所以有了这道题。

前提是有序,所以可以用O(n)解决。

即begin和end两个下标,往中间凑。如果sum满足输出。

如果大于目标,end--;

如果小于目标,begin++;
void sum_print(int* arr, int n, int sum)
{
int i, j;
for(i=0,j=n-1;i<j && i>=0 && j<n; )[......]

继续阅读

求单向链表倒数第 k 个结点

题目:输入一个单向链表,输出该链表中倒数第 k 个结点。

传统做法是获取到链表的长度n,然后走n-k布,此方法弱爆了……

做法:

1、指定一个新的指针,走k步。如果k布之内就到了NULL,显然无倒数第k这说法,返回错误即可。

2、新指针到位后,和root一起next,知道新指针到了NULL。此时输出root指针当前的data即可。
int ll_last_k(struct Node* root, int k)
{
// Make two ptr diff k di[......]

继续阅读