题目如下:
给出字符串:99xxxx,输出将9替换成g的所有组合结果,例如99xxxx,9gxxxx,g9xxxx,ggxxxx
/** * g 9 看成 0 1 构成所有组合 */
public static String process(String words) {
if(words == null || words.length() == 0)
return null;
char[] chs = words.toCharArray();
List<Integer> indexList = new ArrayList<>();
StringBuilder result = new StringBuilder();
int len = chs.length;
int count = 0;
for(int i = 0; i < len; i++) {
if(chs[i] == '9' || chs[i] == 'g') {
count++;
indexList.add(i);
}
}
if(count == 0 && indexList.size() == 0)
return words;
int num = 1 << count;
int lenList = indexList.size();
//这里是算法的核心
for(int i = 0; i < num; i++) {
for(int j = 0; j < lenList; j++) {
if(((i>>>j)&1) != 0) {
chs[indexList.get(j)] = '9';
}else {
chs[indexList.get(j)] = 'g';
}
}
result.append(String.valueOf(chs)).append(",");
}
return result.substring(0, result.length() - 1);
}
public static void main(String[] args) {
//测试案列
String words = "99xxxx";
System.out.println(process(words));
System.out.println("---------------------------1");
words = "9x9xg";
System.out.println(process(words));
System.out.println("---------------------------2");
words = "xxxx";
System.out.println(process(words));
System.out.println("---------------------------3");
words = "gggxx9";
System.out.println(process(words));
}
现在学校图书馆需要一个借书系统,每个人只需要在网上提交借书申请即可,一个人一个清单,借书上线为n,每本书用数字1-n,表示,同时可能有m个人上网借书,现图书馆办公网络中已经提交了一批借书清单,在屏幕中,每行表示一个清单,并且处于清单中同一行的不同书号以空格划分,最后一行用n表示,请为屏幕中的所有借书清单重新排序,排序要求为
1:如果没有交集,则按清单提交顺序排序
2:如何两个清单有交集,要求有交集的清单尽量放在一起,并且按照清单提交的顺序进行排序。
比如说输入为:
2 3 11
4 8
5 3
2 6 9
5 7
n
输出为
2 3 11
5 3
5 7
2 6 9
4 8
public static List<String> sort(List<String> booksList) {
if(booksList == null || booksList.size() == 0)
return null;
int len = booksList.size();
List<String> result = new ArrayList<>();
boolean[] visited = new boolean[len];
//第一都置为false
for(int i = 0; i < len; i++) {
visited[i] = false;
}
//进行深度遍历
for(int i = 0; i < len; i++) {
if(!visited[i])
DFSCore(i, visited, result, booksList);
}
return result;
}
public static void DFSCore(int i, boolean[] visited, List<String> result, List<String> booksList) {
visited[i] = true;
String valueA = booksList.get(i);
//把值添加到结果里
result.add(valueA);
//获取所有相交的下标
List<Integer> insections = getInsection(visited, valueA, booksList);
if(insections != null && !insections.isEmpty()) {
int len = insections.size();
for(int j = 0; j < len; j++) {
int index = insections.get(j);
if(!visited[index]) {
DFSCore(index, visited, result, booksList);
}
}
}
}
//得到所有交集的下标
public static List<Integer> getInsection(boolean[] visited, String valueA, List<String> booksList) {
List<Integer> result = new ArrayList<>();
int len = booksList.size();
for(int i = 0; i < len; i++) {
String valueB = booksList.get(i);
if(!visited[i]) {
if(isIntersection(valueA, valueB))
result.add(i);
}
}
return result.size() == 0 ? null : result;
}
//判断是否有交集
public static boolean isIntersection(String valueA, String valueB) {
String[] nums = valueB.split(" ");
for(String num : nums) {
if(valueA.contains(num))
return true;
}
return false;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<String> booksList = new ArrayList<>();
while(scanner.hasNextLine()) {
String value = scanner.nextLine();
if(value.equals("n"))
break;
booksList.add(value);
}
List<String> sortedBooksList = sort(booksList);
sortedBooksList.forEach(System.out::println);
}
相当于股票买卖问题
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = 0;
if(scan.hasNextLine()) {
num = Integer.parseInt(scan.nextLine());
}
if(num > 0) {
int[] moneys = new int[num];
int count = 0;
while(count < num) {
if(scan.hasNextInt()) {
moneys[count] = scan.nextInt();
}
count++;
}
System.out.println(process(moneys));
}
}
public static int process(int[] moneys) {
if(moneys == null || moneys.length == 0 || moneys.length == 1)
return 0;
int minPrice = moneys[0];
int len = moneys.length;
int leftMaxProfit = 0;
int[] leftProfits = new int[len];
for(int i = 1; i < len; i++) {
if(moneys[i] < minPrice) {
minPrice = moneys[i];
}else {
leftMaxProfit = Math.max(leftMaxProfit, moneys[i]-minPrice);
}
leftProfits[i] = leftMaxProfit;
}
int MaxProfit = leftMaxProfit;
int rightMaxProfit = 0;
int maxPrice = moneys[len-1];
for(int i = len-2; i >= 0; i--) {
if(moneys[i] > maxPrice) {
maxPrice = moneys[i];
}else {
rightMaxProfit = Math.max(rightMaxProfit, maxPrice-moneys[i]);
}
MaxProfit = Math.max(MaxProfit, rightMaxProfit+leftProfits[i]);
}
return MaxProfit;
}
网易CC里,有很多礼物(总数<1000种礼物),每一种礼物都有一个编号ID,系统里使用1到10位的数字串(其实是字符串,只不过刚好是数字而已)来表示这个ID,如3个礼物ID:{44, 45, 470}。
其中礼物又分为付费礼物与免费礼物。现在我们将一小时内,当前主播收到的所有礼物(付费+免费)的ID串起来,就形成了一个很大的数字串V(总长度<20000)。
现在给定一个全部由礼物ID合成的串V,计算里面最多有多少次付费礼物的消费。
如付费礼物ID表:S = {12,3,4,44,45,470}
全部由礼物ID合成的数字串V:V = 1434512412744
最多可以由 8 个礼物组成。分别为: 4, 3, 45, 12, 4, 12,4,4这8次付费礼物的消费。
输入
第1行输入付费礼物个数,N
接下来N行(第2到第N+1行)输入每个付费礼物的ID。1<= ID的长度 <10位。
最后一行输入礼物ID串V
输出
最多送了多少个付费礼物。
样例输入
6
12
3
4
44
45
470
1434512412744
样例输出
8
/* 给一个很长很长的母串长度为n,然后给m个小的模式串。求这m个模式串里边有多少个是母串的字串。 */
public class WangYi5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Trie root = new Trie();
int num = 0;
if(scan.hasNextInt())
num = scan.nextInt();
//注意
scan.nextLine();
int count = 0;
String s = "";
//输入字符串并构造Trie
while(count < num) {
if(scan.hasNextLine())
s = scan.nextLine();
//构造Trie树
build(root, s);
count++;
}
//把每一个加上suffix
root.suffix = root;
ArrayDeque<Trie> queue = new ArrayDeque<>();
for(int i = 0; i < 10; i++) {
if(root.next[i] == null) {
root.next[i] = root;
}else {
root.next[i].suffix = root;
//保存不为空的数字字符
queue.offerLast(root.next[i]);
}
}
Trie cur, suf;
//层次遍历
while(!queue.isEmpty()) {
cur = queue.pollFirst();
suf = cur.suffix;
for(int i = 0; i < 10; i++) {
if(cur.next[i] == null) {
cur.next[i] = suf.next[i];
}else {
cur.next[i].suffix = suf.next[i];
queue.offerLast(cur.next[i]);
}
}
}
if(scan.hasNextLine())
s = scan.nextLine();
int len = s.length();
count = 0;
cur = root;
for(int i = 0; i < len; ++i) {
int id = s.charAt(i) - '0';
cur = cur.next[id];
if(cur.flag == 1) {
count++;
cur = root;//加上这个条件是因为不能重复计算(例如:45只能算一种,不能算4和45两种)
}
}
System.out.println(count);
}
//构造树
public static void build(Trie root, String s) {
Trie cur = root;
int len = s.length();
for(int i = 0; i < len; i++) {
int id = s.charAt(i) - '0';
if(cur.next[id] == null) {
Trie trie = new Trie();
cur.next[id] = trie;
}
cur = cur.next[id];
}
cur.flag = 1;
}
}
class Trie {
int flag;
Trie[] next;
Trie suffix;
Trie() {
flag = 0;
next = new Trie[10];
suffix = null;
}
}
请求行
例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件。
请求头
例如Accept-Language: en
空行
其他消息体
状态码:
1xx消息
这一类型的状态码,代表请求已被接受,需要继续处理。
100 Continue
客户端应当继续发送请求。
101 Switching Protocols
服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。
102 Processing
代表处理将被继续执行。
2xx成功
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
200 OK
请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 Created
请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其URI已经随Location头信息返回。
202 Accepted
服务器已接受请求,但尚未处理。返回202状态码的响应的目的是允许服务器接受其他过程的请求
203 Non-Authoritative Information
服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。
204 No Content
服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。
205 Reset Content
服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。
206 Partial Content
服务器已经成功处理了部分GET请求。类似于FlashGet或者迅雷这类的HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
207 Multi-Status
代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
3xx重定向
通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应Location域中指明。
300 Multiple Choices
被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。
301 Moved Permanently
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。
302 Found
请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
303 See Other
对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。
304 Not Modified
如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。
305 Use Proxy
被请求的资源必须通过指定的代理才能被访问。
306 Switch Proxy
在最新版的规范中,306状态码已经不再被使用。
307 Temporary Redirect
请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
4xx客户端错误
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。
400 Bad Request
由于包含语法错误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
401 Unauthorized
当前请求需要用户验证。
403 Forbidden
服务器已经理解请求,但是拒绝执行它。
404 Not Found
请求失败,请求所希望得到的资源未被在服务器上发现。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
405 Method Not Allowed
请求行中指定的请求方法不能被用于请求相应的资源。
406 Not Acceptable
请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
407 Proxy Authentication Required
客户端必须在代理服务器上进行身份验证。
408 Request Timeout
请求超时。
409 Conflict
由于和被请求的资源的当前状态之间存在冲突,请求无法完成。
410 Gone
被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。
5xx服务器错误
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生
500 Internal Server Error
服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
501 Not Implemented
服务器不支持当前请求所需要的某个功能。
502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 Service Unavailable
由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
504 Gateway Timeout
作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应。
505 HTTP Version Not Supported
服务器不支持,或者拒绝支持在请求中使用的HTTP版本
507 Insufficient Storage
服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。
509 Bandwidth Limit Exceeded
服务器达到带宽限制。
510 Not Extended
获取资源所需要的策略并没有被满足。
传输层:
网络层: