第一题 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 {1,1,5};{1,5,1};{5,1,1}; 问有多少种不同的分法。 输出一个整数,即不同的分法。
int SplitTheInteger(int n,int k) { int sum = 0; if (k ==1) return 1; if (n < k) return 0; sum += SplitTheInteger(n - 1, k - 1) + SplitTheInteger(n - k, k); return sum; }解题思路 我门可以将数字n当成n个木棍,分给k个人,递推公式是S(n,k)=S(n-1,m-1)+S(n-m,m); 出口为 s(n,1)=1; 如果k大于n 则S(n,m)=0;
第二题 编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2:
输入: [“dog”,“racecar”,“car”] 输出: “” 解释: 输入不存在公共前缀。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-common-prefix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
string longestCommonPrefix(vector<string>& strs) { string s = ""; if (strs.size() == 0) return s; int l = 0; int length = strs[0].length(); for (int i = 0; i < strs.size(); i++) { if (strs[i].length() <= length) { length = strs[i].length(); l = i; } } if (length == 0) return s; for (int j = 0; j < length; j++) { for (int k = 0; k < strs.size() - 1; k++) { if (strs[k].at(j) != strs[k + 1].at(j)) { return s; } } s += strs[l].at(j); } return s; }解题思路:暴力解法,没啥好说的.
第三题 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1:
输入: “()” 输出: true 示例 2:
输入: “()[]{}” 输出: true 示例 3:
输入: “(]” 输出: false 示例 4:
输入: “([)]” 输出: false 示例 5:
输入: “{[]}” 输出: true
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-parentheses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
在bool isValid(string str) { if (str.size() % 2 == 1) return false; if (str == "") return true; stack<char> s; int n = 0; while (n < str.size()) { if (s.empty()) s.push(str[n++]); else { if ((str[n] == ')' && s.top() == '(') || (str[n] == ']' && s.top() == '[') || (str[n] == '}' && s.top() == '{')) s.pop(); else s.push(str[n]); n++; } } if (s.empty()) return true; else return false; }解题思路:利用栈的先进后出的特点,将字符串依次压栈,再判断栈顶元素与压栈元素是否符合,不符合就继续压栈,符合则出栈,若最后栈里面还有元素,则不匹配.