2017年6月2日,周结(十五),一些简单的算法题

来源:互联网 发布:软件测试外包 转型 编辑:程序博客网 时间:2024/06/14 02:44
这一个星期做的最多的算法题还是关于数组和字符串的,对于链表,二叉树等关于的数据结构的知识还是不太理解,不过还是不能放弃,这些东西对以后的自己还是很重要的。

字符串的旋转
题目描述
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"

思路实现:
先观察一下题目,题目看不太懂的话看一下测试样例,可以发现一些规律:p+1之前的字符串即作为旋转后的右半部分,P+1之后的部分是旋转之后的左半部分,根据这个至关重要的规律,我们可以使用一句代码来实现这个效果。

代码实现:

public class StringRotation {
public String rotateString(String A, int n, int p) {
// write code here
return A.substring(p + 1, n) + A.substring(0, p + 1);
}
}




简单字符串的压缩
public class Zipper_zipString {


/**
* @param args

*            题目描述
*            利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“
*            a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个string
*            iniString为待压缩的串(长度小于等于10000
*            ),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。 测试样例
*            "aabcccccaaa" 返回:"a2b1c5a3" "welcometonowcoderrrrr"
*            返回:"welcometonowcoderrrrr"
*/
public static void main(String[] args) {
System.out.println(new Zipper_zipString().zipString("aabcccccaaa"));
}


public String zipString(String iniString) {
// write code here
StringBuffer stringBuffer = new StringBuffer();
char[] a = iniString.toCharArray();
int index = 1;
for (int i = 0; i < a.length - 1; i++) {
if (a[i] == a[i + 1]) {
index++;
} else {
stringBuffer.append(a[i]);
stringBuffer.append(index);
index = 1;
}
}
index = 1;
for (int i = a.length - 1; i >= 0; i--) {
if (a[i] == a[i - 1]) {
index++;
} else {
stringBuffer.append(a[i]);
stringBuffer.append(index);
break;
}
}
if (stringBuffer.toString().length() < iniString.length()) {


return stringBuffer.toString();
}
return iniString;
}
}





替换字符串中的空格
public class Solution_replaceSpace {


/**
* @param args
*            题目描述
*            请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度
*            (小于等于1000),同时保证字符串由大小写的英文字母组成。 给定一个string iniString
*            为原始的串,以及串的长度 int len, 返回替换后的string。 测试样例: "Mr John Smith”,13
*            返回:"Mr%20John%20Smith" ”Hello World”,12 返回:”Hello%20%20World”
*/
public static void main(String[] args) {
System.out.println(new Solution_replaceSpace().replaceSpace(
"hello google a", 14));
}


public String replaceSpace(String iniString, int length) {
// write code here
// return iniString.replaceAll(" ", "%20");
// 如果字符串长度与输入的长度不相等,返回null
if (iniString.length() != length || iniString.isEmpty()) {
return null;
}
// 遍历一下字符串,计算一下有几个空格,并且重新实例化一个字符串
char[] a = iniString.toCharArray();
int index = 0;
for (int i = 0; i < iniString.length(); i++) {
if (a[i] == ' ') {
index++;
}
}
int newlength = length + index * 2;
char[] b = new char[newlength];
b[newlength - 1] = '\0';
for (int i = length - 1; i >= 0; i--) {
if (a[i] == ' ') {
b[newlength - 1] = '0';
b[newlength - 2] = '2';
b[newlength - 3] = '%';
newlength = newlength - 3;
} else {
b[newlength - 1] = a[i];
newlength = newlength - 1;
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
sb.append(b[i]);
}
return sb.toString();


}
}



确定两串乱序同构
public class Solution_checkSam {


/**
* @param args
*            题目描述
*            给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格
*            。 给定一个string stringA和一个string
*            stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。 测试样例:
*            "This is nowcoder","is This nowcoder" 返回:true
*            "Here you are","Are you here" 返回:false
*/
/*
* 解题思路:遍历两个字符串,统计各个字符出现的次数是否相等。
*/
public static void main(String[] args) {
System.out.println(new Solution_checkSam().checkSam("Here you are",
"Are you here"));


}


public boolean checkSam(String stringA, String stringB) {
// write code here
// 如果两个字符串长度不相等,则直接返回false
if (stringA.length() != stringB.length()) {
return false;
}
// 统计两个字符串中出现的各个字符的次数,假设是ascll码
int[] a = new int[256];
char[] a_arr = stringA.toCharArray();
for (char c : a_arr) {
a[c]++;
}
for (int i = 0; i < stringB.length(); i++) {
if (--a[stringB.charAt(i)] < 0) {
return false;
}
}
return true;
}
}



滑动窗口中的最大值
import java.util.ArrayList;


public class Solution_maxInWindows {


/**
* @param args

*            题目描述
*            给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3
*            ,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};
*            针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1},
*            {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1},
*            {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
*/


public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 2, 3, 4, 2, 6, 2, 5, 1 };
System.out.println(new Solution_maxInWindows().maxInWindows(a, 3));
}


public ArrayList<Integer> maxInWindows(int[] num, int size) {
ArrayList<Integer> return_data = new ArrayList<Integer>();
if (num == null) {
return return_data;
}
if (num.length < size || size < 1) {
return return_data;
}
int[] temparr = new int[size];
int temp = 0;
for (int i = 0; i < num.length - size + 1; i++) {
for (int j = 0; j < size; j++) {
temparr[j] = num[i + j];
}
temp = 0;
for (int j = 0; j < temparr.length; j++) {
if (temp < temparr[j]) {
temp = temparr[j];
}
}
return_data.add(temp);
}
return return_data;


}
}



取近似值
import java.util.Scanner;


public class Solution_HUAWEI_GetApproximateValue {


/**
* @param args

*            题目描述
*            写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

*            输入描述: 输入一个正浮点数值


*            输出描述: 输出该数值的近似整数值

*            输入例子: 5.5

*            输出例子: 6
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
float a = scanner.nextFloat();
if (a > 0) {
int b = (int) a;
if (a - b >= 0.5) {
System.out.println(b + 1);
} else {
System.out.println(b);
}
}
}
}

其它知识点:
安卓网络编程

http协议的特点:
  1. 支持C/S(客户/服务器)模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
状态码:
  • 100~199:指示信息,表示请求已接收,继续处理
  • 200~299:请求成功,表示请求已被成功接收、理解、接受
  • 300~399:重定向,要完成请求必须进行更进一步的操作
  • 400~499:客户端错误,请求有语法错误或请求无法实现
  • 500~599:服务器端错误,服务器未能实现合法的请求
常用状态码:
  • 200 OK:客户端请求成功
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 500 Internal Server Error:服务器发生不可预期的错误
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
这些大概就是这一个星期的总结。
原创粉丝点击