public ArrayList<Integer> maxInWindows(int[] num, int size){ LinkedList<Integer> list = new LinkedList<>(); ArrayList<Integer> arrayList = new ArrayList<>(); if (size <= 0 || size > num.length) { return arrayList; } for (int i = 0; i < size; i++) { list.add(num[i]); } Collections.sort(list); arrayList.add(list.getLast());
for (int i = 1; i <= num.length - size; i++) {//窗口前移 list.remove(new Integer(num[i - 1])); list.add(num[i + size - 1]); Collections.sort(list); arrayList.add(list.getLast()); } return arrayList; }
publicP(int x, int y){ this.x = x; this.y = y; if (x < 0 || y < 0 || x >= X || y >= Y) { c = ' '; } else { this.c = mat[Y * x + y]; } }
@Override publicbooleanequals(Object obj){ return x == ((P) obj).x && y == ((P) obj).y; }
@Override publicinthashCode(){ int i = Integer.valueOf(x + "" + y); return i; } }
publicbooleanhasPath(char[] matrix, int rows, int cols, char[] str){ mat = matrix; this.str = str; X = rows; Y = cols; List<P> list = findFirst(str[0]); for (P p : list) { if (findPath(p)) { returntrue; } } returnfalse; }
Set<P> set = new HashSet<>(); boolean ok = false;
privatebooleanfindPath(P p){ ok = false; set.clear(); dfs(p, 0); if (ok) { returntrue; } else { returnfalse; } }
privatevoiddfs(P p, int i){
if (ok || p.c == ' ' || set.contains(p)) { return; } if (p.c == str[i]) { if (i == str.length - 1) {/** 路径找到了 */ ok = true; return; } set.add(p); dfs(new P(p.x + 1, p.y), i + 1); dfs(new P(p.x - 1, p.y), i + 1); dfs(new P(p.x, p.y + 1), i + 1); dfs(new P(p.x, p.y - 1), i + 1); } }
private List<P> findFirst(char c){ List<P> list = new ArrayList<>(); for (int i = 0; i < X; i++) { for (int j = 0; j < Y; j++) { P p = new P(i, j); if (p.c == c) { list.add(p); } } } return list; }
// 几个全局变量,便于程序的简洁,只是在刷题中建议 char *mat = 0; int h = 0, w = 0; int str_len = 0; int dir[5] = {-1, 0, 1, 0, -1}; boolhasPath(char* matrix, int rows, int cols, char* str) { mat = matrix; h = rows, w = cols; str_len = strlen(str);
for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (dfs(i, j, 0, str)) { returntrue; } } } returnfalse; }
classSolution { public: char *mat = 0; int h = 0, w = 0; int str_len = 0; int dir[5] = {-1, 0, 1, 0, -1};
booldfs(int i, int j, int pos, char *str){ // 因为dfs调用前,没有进行边界检查, // 所以需要第一步进行边界检查, // 因为后面需要访问mat中元素,不能越界访问 if (i < 0 || i >= h || j < 0 || j >= w) { returnfalse; }
public: using V = vector<int>; using VV = vector<V>; int dir[5] = {-1, 0, 1, 0, -1};
intcheck(int n){ int sum = 0;
while (n) { sum += (n % 10); n /= 10; }
return sum; }
voiddfs(int x, int y, int sho, int r, int c, int &ret, VV &mark){ // 检查下标 和 是否访问 if (x < 0 || x >= r || y < 0 || y >= c || mark[x][y] == 1) { return; } // 检查当前坐标是否满足条件 if (check(x) + check(y) > sho) { return; } // 代码走到这里,说明当前坐标符合条件 mark[x][y] = 1; ret += 1;
for (int i = 0; i < 4; ++i) { dfs(x + dir[i], y + dir[i + 1], sho, r, c, ret, mark); }
} intmovingCount(int sho, int rows, int cols) { if (sho <= 0) { return0; }
VV mark(rows, V(cols, -1)); int ret = 0; dfs(0, 0, sho, rows, cols, ret, mark); return ret; } };
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
1
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
解答
等差数列公式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
for (int i = (int) Math.pow(2 * sum, 0.5); i > 1; i--) { int t = (2 * sum / i - i + 1); if (t % 2 != 0 || 2 * sum % i != 0) { continue; } ArrayList<Integer> tl = new ArrayList<>(); t = t >> 1; for (int j = 0; j < i; j++) { tl.add(t + j); } ans.add(tl); } return ans; }
publicbooleanIsBalanced_Solution(TreeNode root){ if (root == null) { returntrue; } int left = deepth(root.left) + 1; int right = deepth(root.right) + 1;
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
解答
测试用例没有说清楚,导致试了半天
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public String ReverseSentence(String str){ if (str == null ) { return""; } if (str.trim().equals("")) { return str;//没有说明,只能试,有点坑 } String[] strings = str.split(" ");
StringBuilder builder = new StringBuilder(str.length()); for (int i = strings.length - 1; i >= 0; i--) { builder.append(" "); builder.append(strings[i]); } return builder.toString().substring(1); }