文章目录
不使用比较运算求出两个数的最大值与最小值
根据数学公式,我们知道最大值Max(a,b)=(a+b+| a-b|)/2,最小值Min(a,b)=(a+b-|a-b|)/2.,如果使用这种方法求最大最小值,当a和b的值非常大时,它们的和可能会发生数据溢出的情况.把a和b变为长整型(long)可避免溢出.
public static long max(long a,long b) {
return (a+b+Math.abs(a-b))/2;
}
public static long min(long a,long b) {
return (a+b-Math.abs(a-b))/2;
}
消除嵌套的括号
问题描述:
给定一个如下格式的字符串(1,(2,3),(4,(5,6),7)),括号内的元素可以是数字,也可以是另一个括号,实现一个算法以消除嵌套的括号,例如,把上面的表达式变成(1,2,3,4,5,6,7).若表达式有误,则报错.
思路分析:
判断表达式是否正确,再消除表达式中嵌套的括号,对于判定表达式是否正确这个问题,我们发现:表达式只有数字,逗号和括号这几种字符,如果有其他字符出现则是非法表达式;其次,判断括号是否匹配,若是碰到"(",则把括号的计数器值加1;如果碰到")"此时判断计数器值是否大于1,若是则把计数器减1,否则为非法表达式.当遍历完表达式后,若括号计数器值为0,则配对成功.
代码实现:
public class 消除嵌套括号 {
public static String change_str(String s) {
String result="(";
char[] ch=s.toCharArray();
int bracket_num=0;
int i=0;
while(i<ch.length) {
if (ch[i]=='(') {
bracket_num++;
}
else if(ch[i]==')')
if (bracket_num>0)
bracket_num--;
else {
System.out.println("Exception wrong!\n");
return null;
}
else if (ch[i]==',') {
result+=ch[i++];
continue;
}else if (ch[i]>='0'&&ch[i]<='9') {
result+=ch[i];
}else {
System.out.println("Exception wrong~\n");
return null;
}
i++;
}
if (bracket_num>0) {
System.out.println("Exception wrong~\n");
return null;
}
result+=')';
return result;
}
}
实现字符串的反转
进行两次字符串反转,第一次对整个字符串"how are you"中的字符进行反转,结果为"uoy era woh",接着对每个单词进行反转.
public static String LeftRotateString(String str) {
StringBuilder sBuilder=new StringBuilder(str);
sBuilder=sBuilder.reverse();
str=sBuilder.toString();
String string[]=str.split(" ");
StringBuilder sBuilder2=new StringBuilder("");
for(int i=0;i<string.length;i++) {
sBuilder=new StringBuilder(string[i]);
sBuilder2.append(sBuilder.reverse()+" ");
}
sBuilder2.delete(sBuilder2.length()-1, sBuilder2.length());
return sBuilder2.toString();
}
public static void main(String[] args) {
String string="how are you";
System.out.println(LeftRotateString(string));
}
判断两个字符串是否由相同字符组成
问题描述:
由相同字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已,例如"aaaabbc"与"abcbaaa"就由相同的字符组成.
解法1:排序法.
最容易想到的方法就是对两个字符串中的字符进行排序,比较两个排序后的字符串是否相等.时间复杂度取决于使用的排序算法,而哪怕是快排,时间复杂度也为O(2nlogn).
代码实现:
public static void compare(String s1,String s2) {
byte[] b1=s1.getBytes();
byte[] b2=s2.getBytes();
Arrays.sort(b1);
Arrays.sort(b2);
s1=new String(b1);
s2=new String(b2);
if (s1.equals(s2)) {
System.out.println("equal");
}else {
System.out.println("not equal");
}
}
解法2:空间换时间.
字符串只是用ASCII字符,而ASCII字符共有266个,我们可以创建一个大小为256的数组来记录各个字符出现的次数,遍历第一个字符串时+1,遍历第二个字符串时下标-1,如果最后数组中各个元素的值为0,则这两个字符串由相同的字符组成.时间复杂度为O(2n+256);
代码实现:
public static void compare2(String s1,String s2) {
byte[] b1=s1.getBytes();
byte[] b2=s2.getBytes();
int bCount[]=new int[256];
for(int i=0;i<256;i++) {
bCount[i]=0;
}
for(int i=0;i<b1.length;i++) {
bCount[b1[i]-