xxx
压缩报文还原
- 输入一个压缩后的报文,返回它解压后的原始报文。
- 压缩规则:n[str],表示方括号内部的 str 重复 n 次。
注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
输入:
压缩的报文
输出:
解压后的原始报文
示例一
输入:
3[k]2[mn]
输出
kkkmnmn
示例二
输入
3[m2[c]]
输出
mccmccmcc
示例三
输入
3[m2[cde3[ffgi]]]
输出
mcdeffgiffgiffgicdeffgiffgiffgimcdeffgiffgiffgicdeffgiffgiffgimcdeffgiffgiffgicdeffgiffgiffgi
思路:
- 遍历压缩的报文的每个字符;
- 如果是字母或者数字,则入栈char_digit_stack;
- 如果是 [ {[} [则入栈parenth_stack;
- 如果是 ] {]} ] 则while parenth_stack: 循环出栈字符和[
python实现:
if __name__ == '__main__':s = input().strip()char_digit_stack = []parenth_stack = []result = ""# 入栈for i in s:if i.isdigit() or i.isalpha():char_digit_stack.append(i)elif i == '[':parenth_stack.append(i)elif i == "]":# 出栈temp = ""while parenth_stack:char = char_digit_stack.pop()if char.isalpha():temp = char + tempelif char.isdigit():parenth_stack.pop()temp = int(char) * tempresult += tempprint(result)
java实现:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main0115 {public static final Pattern PATTERN = Pattern.compile("[0-9]+\\[[a-z]+]");public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {String line = scanner.nextLine();String res = solution(line);System.out.print(res);}}private static String solution(String line) {Matcher matcher = PATTERN.matcher(line);if (matcher.find()) {String group = matcher.group();int pos = group.indexOf('[');int times = Integer.parseInt(group.substring(0, pos));String words = group.substring(pos + 1, group.length() - 1);StringBuilder builder = new StringBuilder();for (int i = 0; i < times; i++) {builder.append(words);}String fixed = line.replace(group, builder.toString());return solution(fixed);} else {return line;}}
}
符合条件的子串长度
- 给定字符串A、B和正整数V,字符串A和B的长度相等,
- 计算A中满足如下条件的最大连续子串的长度:
- 该连续子串在A和B中的位置和长度相同。(对应位置截取子串)
- 该连续子串每个元素差距 ∣ A [ i ] − B [ i ] ∣ {|A[i] - B[i] |} ∣A[i]−B[i]∣(两个字母ASCII码之差的绝对值)之和小于等于V
输入:
第一行输入字符串A,仅包含小写字母,1 <= A.length <= 1000
第二行输入字符串B,仅包含小写字母,1 <= B.length <= 1000
第三行输入正整数V,0 <= V <= 10000
输出:
字符串A 最大连续子串的长度
示例一
输入:
xxcdefg
cdefghi
5
输出:
2
思路:
- 遍历字符串A B的索引(for i in range(n) ),对应A B位置,以每个字符开头的连续子串中,寻找最大长度的;
- 满足子串中对应字符的差值(绝对值)求和 <= V;
- 每次取最大长度;
python实现:
if __name__ == '__main__':# xxcdefg# cdefghi# 5# 输入s1 = input().strip()s2 = input().strip()v = int(input().strip())n = len(s1)max_len = 0for i in range(n): # 以每个字符开头的连续子串j = isum_ = 0while j < n:a, b = s1[j], s2[j]sum_ += abs(ord(a) - ord(b))if sum_ <= v:j += 1else:max_len = max(max_len, j-i)breakprint(max_len)
java实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main0128 {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {String a = scanner.nextLine();String b = scanner.nextLine();int v = scanner.nextInt();solution(a, b, v);}}private static void solution(String a, String b, int v) {int max = 0;int length = 0;List<Integer> list = new ArrayList<>();list.add(Math.abs(a.charAt(0) - b.charAt(0)));int count = list.get(0);for (int i = 1; i < a.length(); i++) {int temp = Math.abs(a.charAt(i) - b.charAt(i));list.add(temp);count += Math.abs(temp);if (count <= v) {length = list.size();} else {count -= list.get(0);list.remove(0);}max = Math.max(length, max);}System.out.println(max);}
}
找单词
-
给一个二维数组和一个字符串,如果该字符串(每个字符)存在于该数组中,则按字符串的字符顺序,输出每个字符所在数组的位置下标,如果找不到,返回字符串。
-
按照字符串的字符顺序搜索,且搜索到的位置必须是相邻的,其中“相邻”是指那些水平相邻或垂直相邻的位置。
-
同一个位置内的字母不允许被重复使用。假定在数组中最多只存在一个可能的匹配。
输入:
第1行 二维数组的行数 n ;
后续n行 大写字符 数组,以 , 分割
最后一行 待查找的字符串,由大写字符组成。
二维数组的大小为N*N,0 < N <= 100。
单词长度K,0 < K < 1000。
输出:
输出位置下标字符串,拼接格式为:第1个字符行下标+“,”+第1个字符列下标+“,”+第2个字符行下标+“,”+第2个字符列下标…+“,”+第N个字符行下标+“,”+第N个字符列下标
示例一
输入:
4
A,C,C,F
C,D,E,D
B,E,S,S
F,E,C,A
ACCESS
输出
0,0,0,1,0,2,1,2,2,2,2,3
说明
ACCESS分别对应二维数组的[0,0] [0,1] [0,2] [1,2] [2,2] [2,3]下标位置
思路:
- 遍历 目标字符串 中的每个字符,逐一在arr二维数值每行中循环查找;
- 查找第一个字符,找到则将(i,j)位置存入idx_list中,并标记flag=True表示当前字符找到,break 查找的循环。
- 查找第二个、三个、… 字符时
- 若出现一个找不到的(查找循环结束 flag=False),则停止外层字符串的遍历,输出当前字符串(未找到)
- 若找到位置(i,j),判断是否重复(即是否在idx_list中),重复则从下一行 或者 下一列 的位置继续查找(index(val, j));
- 找到不重复的位置,需要判断是否与上一个位置上下左右连续,是则存入idx_list 并flag=True,结束查找循环。
python实现:
if __name__ == '__main__':# 4# A, C, C, F# C, D, E, D# B, E, S, S# F, E, C, A# ACCESSn = int(input().strip())arr = []for i in range(n):arr.append(input().strip().split(","))target_word = input().strip()# 搜索单词中的每个字符idx_list = []for char in target_word: # 必须按照顺序查找i = 0j = 0flag = False # 标识某次没有查询到print("cur char:", char)while i < n: # 搜索print("******", i)try:j = arr[i].index(char, j)if (i,j) in idx_list: # 位置不能重复print("11111:", i,j)print("idx list:", idx_list)j += 1if j < n:continueelse:raise ValueError(j)elif not idx_list:print("2222:", j)idx_list.append((i,j))flag = Truebreak # 结束搜索else: # 找到的点是否连续print("33333:", j)pre = idx_list[-1]if (abs(pre[0] - i) == 1 and pre[1] == j) or (abs(pre[1] - j) == 1 and pre[0] == i):print("3333找到连续点", i,j)idx_list.append((i,j))flag = Truebreakexcept ValueError:i += 1j = 0if not flag:# 某个字符没找到print(target_word)break# 找到位置result = ""for i in idx_list:i_str = f"{i[0]},{i[1]},"result += i_strprint(result[:-1])
java:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main0100 {static List<String> res = new ArrayList<>();public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = Integer.parseInt(scanner.nextLine());char[][] matrix = new char[N][N];for (int i = 0; i < N; i++) {matrix[i] = scanner.nextLine().replaceAll(",", "").toCharArray();}String word = scanner.nextLine();scanner.close();if (exist(matrix, word)) {for (int i = res.size() - 1; i >= 0; i--) {System.out.print(res.get(i));if (i != 0) {System.out.print(",");}}} else {System.out.println("N");}}public static boolean exist(char[][] board, String word) {int h = board.length, w = board[0].length;boolean[][] visited = new boolean[h][w];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {boolean flag = check(board, visited, i, j, word, 0);if (flag) {res.add(i + "," + j);return flag;}}}return false;}public static boolean check(char[][] board,boolean[][] visited,int i, int j, String s, int k) {if (board[i][j] != s.charAt(k)) {return false;} else if (k == s.length() - 1) {return true;}visited[i][j] = true;int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};boolean result = false;for (int[] dir : directions) {int newi = i + dir[0], newj = j + dir[1];if (newi >= 0 && newi < board.length &&newj >= 0 && newj < board[0].length) {if (!visited[newi][newj]) {boolean flag = check(board, visited, newi, newj, s, k + 1);if (flag) {res.add(newi + "," + newj);result = true;break;}}}}visited[i][j] = false;return result;}
}
叠放书籍
书籍的长宽都是整数对应(l, w)
如果书A的长宽度都比B长宽大时,
则允许将B排列放在A上面,
现在有一组规格的书籍,
书籍叠放时要求,书籍不能做旋转,
请计算最多能有多少个规格书籍能叠放在一起。
输入描述
输入:books=[[20,16],[15,11],[10,10],[9,10]]
说明:总共有4本书,第一本长度为20 宽度为16
第一本长度为15 宽度为11
以此类推
最后一本书长度为9 宽度为10
输出描述
输出:3
说明: 最多三个规格的书籍可以叠放在一起 ,
从下到上依次是[20,16],[15,11],[10,10]
示例一
输入
[[20,16],[15,11],[10,10],[9,10]]
输出
3
java:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main0118 {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {String input = scanner.nextLine();solution(input);}}private static void solution(String input) {List<Book> books = new ArrayList<>();String[] split = input.substring(2, input.length() - 2).split("],\\[");for (String book : split) {String[] lw = book.split(",");int l = Integer.parseInt(lw[0]);int w = Integer.parseInt(lw[1]);books.add(new Book(l, w));}books.sort(Book::compareTo);int res = counter(books);System.out.println(res);}private static int counter(List<Book> books) {int count = 0;Book last = null;for (Book cur : books) {if (last == null) {count = 1;last = cur;} else if (last.l > cur.l && last.w > cur.w) {count++;last = cur;}}return count;}private static class Book implements Comparable<Book> {int l;int w;public Book(int l, int w) {this.l = l;this.w = w;}@Overridepublic int compareTo(Book o) {if (this.l >= o.l && this.w >= o.w) {return -1;} else {return o.l - this.l;}}}
}
篮球比赛
篮球(5v5)比赛中每个球员拥有一个战斗力,
每个队伍的所有球员战斗力之和为该队伍的总体战斗力。
现有十个球员准备分为两队进行训练赛,
教练希望两个队伍的战斗力差能够尽可能的小,以达到最佳训练效果。
给出十个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?
请输出该分队方案下的最小战斗力差值。
输入描述
十个篮球队员的战斗力(整数,范围[1,10000]),战斗力之间用空格分隔,
如:10 9 8 7 6 5 4 3 2 1
不需要考虑异常输入的场景
输出描述
最小战斗力差值,
如:1
示例一
输入
10 9 8 7 6 5 4 3 2 1
输出
1
说明
1 2 5 9 10 分为一队,3 4 6 7 8 分为一队,两队战斗力之差最小,输出差值1。
备注
球员分队方案不唯一,但最小战斗力差值固定是1
java:
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;public class Main0098 {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {String line = scanner.nextLine();solution(line);}}private static void solution(String line) {String[] split = line.split(" ");List<Integer> ints = new LinkedList<>();for (String s : split) {ints.add(Integer.parseInt(s));}int min = Integer.MAX_VALUE;for (int i = 0; i < 10000; i++) {Random random = new Random();List<Integer> tmp = new LinkedList<>(ints);int x = 0, y = 0;for (int j = 0; j < 5; j++) {x += tmp.remove(random.nextInt(tmp.size()));y += tmp.remove(random.nextInt(tmp.size()));}int diff = Math.abs(x - y);if (diff < min) {min = diff;}}System.out.println(min);}
}
跳格子2
小明和朋友玩跳格子游戏,有 n 个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择以任意格子起跳,但是不能跳连续的格子,不能回头跳,也不能超过一圈;
给定一个代表每个格子得分的非负整数数组,计算能够得到的最高分数。
输入描述
给定一个数例,第一个格子和最后一个格子首尾相连,如: 2 3 2
输出描述
输出能够得到的最高分,如: 3
备注
1≤nums.length≤100
1≤nums[i]≤1000
示例一
输入
2 3 2
输出
3
说明
只能跳3这个格子,因为第一个格子和第三个格子首尾相连
示例二
输入
1 2 3 1
输出
4
说明
1 + 3 = 4
python:
def rob(nums, start, end):pre2, pre1 = 0, 0for i in range(start, end + 1):cur = max(pre1, pre2 + nums[i])pre2 = pre1pre1 = curreturn pre1nums = list(map(int, input().split()))
if len(nums) == 1:print(nums[0])
else:print(max(rob(nums, 0, len(nums) - 2), rob(nums, 1, len(nums) - 1)))
java:
package com.amoscloud.nowcoder.refactor.t0251_0260;import java.util.Scanner;public class Main0251 {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {String[] input = scanner.nextLine().split(" ");int[] nums = new int[input.length];for (int i = 0; i < input.length; i++) {nums[i] = Integer.parseInt(input[i]);}System.out.println(solution(nums));}}public static int solution(int[] nums) {if (nums.length == 1) return nums[0];return Math.max(rob(nums, 0, nums.length - 2), rob(nums, 1, nums.length - 1));}private static int rob(int[] nums, int start, int end) {int pre2 = 0, pre1 = 0;for (int i = start; i <= end; i++) {int cur = Math.max(pre1, pre2 + nums[i]);pre2 = pre1;pre1 = cur;}return pre1;}
}
招聘
某公司组织一场公开招聘活动,假设由于人数和场地的限制,
每人每次面试的时长不等,并已经安排给定,
用(S1,E1)、(S2,E2)、(Sj,Ej)…(Si < Ei,均为非负整数)表示每场面试的开始和结束时间。
面试采用一对一的方式,即一名面试官同时只能面试一名应试者,
一名面试官完成一次面试后可以立即进行下一场面试,且每个面试官的面试人次不超过m。
为了支撑招聘活动高效顺利进行,请你计算至少需要多少名面试官。
输入描述
输入的第一行为面试官的最多面试人次m,第二行为当天总的面试场次n,
接下来的n行为每场面试的起始时间和结束时间,起始时间和结束时间用空格分隔。
其中,1 <= n, m <= 500
输出描述
输出一个整数,表示至少需要的面试官数量。
示例一
输入
2
5
1 2
2 3
3 4
4 5
5 6
输出
3
说明
总共有5场面试
且面试时间都不重叠
但每个面试官最多只能面试2人次
所以需要3名面试官
示例二
输入
3
3
1 2
2 3
3 4
输出
1
说明
总共有3场面时,面试时间都不重叠
每个面试官最多能面试3人次
所以只需要一名面试官
示例三
输入
3
3
8 35
5 10
1 3
输出
2
说明
总共有3场面时,[5,10]和[8,35]有重叠
所以需要2名面试官
java:
import java.util.*;public class Main0111 {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {int m = scanner.nextInt();int n = scanner.nextInt();int[][] arr = new int[n][2];for (int i=0;i<n;i++){arr[i][0] = scanner.nextInt();arr[i][1] = scanner.nextInt();}solution(m, n, arr);}}private static void solution(int m, int n, int[][] arr) {Arrays.sort(arr, Comparator.comparing(c1->c1[0]));Deque<int[]> deque = new ArrayDeque<>();deque.offer(new int[]{arr[0][1],1});for (int i = 1; i < n; i++) {boolean flag = false;for (int[] p : deque) {if (p[0]<= arr[i][0] && p[1]< m){p[1]++;p[0] = arr[i][1];flag = true;break;}}if (!flag){deque.offer(new int[]{arr[i][1],1});}}System.out.print(deque.size());}
}