LeetCode刷题总结(C语言版)字符串类

编程总结

每每刷完一道题后,其思想和精妙之处没有地方记录,本篇博客用以记录刷题过程中的遇到的算法和技巧

122. 买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3

[7, 1, 5, 6] 第二天买入,第四天卖出,收益最大(6-1),所以一般人可能会想,怎么判断不是第三天就卖出了呢? 这里就把问题复杂化了,根据题目的意思,当天卖出以后,当天还可以买入,所以其实可以第三天卖出,第三天买入,第四天又卖出((5-1)+ (6-5) === 6 - 1)。所以算法可以直接简化为只要今天比昨天大,就卖出。

    for (int i = 1; i < pricesSize; i++) {
        if (prices[i] > prices[i-1]) { // 今天比昨天大,累加利润
            profit = profit + prices[i] - prices[i-1];
        }
    }

412. Fizz BuzzI

写一个程序,输出从 1 到 n 数字的字符串表示。

  1. 如果 n 是3的倍数,输出“Fizz”;
  2. 如果 n 是5的倍数,输出“Buzz”;
    3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

本题重点测试 sprintf函数和指向指针的指针的空间分配处理

char **fizzBuzz(int n, int* returnSize) {
	int len = 0;
	int in = n;
	int i;
	char **ret;

	ret = (char**)malloc(sizeof(char*) * n); //分配n个指针,每个指针分别指向一个地址
	*returnSize = n;

	do {
		len++;
		in /= 10;
	} while (in);

	for (i = 1; i <= n; i++) {  // 0 不记录,从1开始记录
		if (i % 3 == 0 && i % 5 == 0) {
			ret[i - 1] = (char *)malloc(strlen("fizzfuzz") + 1);
			sprintf(ret[i - 1], "%s", "FizzBuzz");
		}
		else if (i % 5 == 0) {
			ret[i - 1] = (char *)malloc(strlen("Buzz") + 1);
			sprintf(ret[i - 1], "%s", "Buzz");
		}
		else if (i % 3 == 0) {
			ret[i - 1] = (char *)malloc(strlen("Fizz") + 1);
			sprintf(ret[i - 1], "%s", "Fizz");
		}
		else {
			ret[i - 1] = (char *)malloc(len + 1);
			sprintf(ret[i - 1], "%d", i);
		}
	}

	return ret;
}

你可能感兴趣的:(匠心)