把一个字符串中大写字母排列到前面,小写字母排列到后面。
就干这个,NOTICE,不需要排序,也别整Set那些玩意,显得低能。"HiHelloWorld" ==> "HHWielloorld";
解决方案 »
- 我不准备使用JBuilder ,那么JCreator和Eclipse那个更好
- 高手请进:RMIC生成远程Stub时提示找不到实现接口类文件?
- 关于JButton的问题
- String 类型的值是否可以修改。
- linux系统下,我用WINE安装了普通的QQ, 没见它的图标 请问我怎么运行它?到哪里找? 我连C盘也没找到,在哪儿?在线等!!谢谢
- 一个关于Static的问题,讨论static的具体用法
- 利用一只灯泡,就找出了 Java 和 .Net 虚拟机上安全问题
- 怎样将自己的jpx 或者 jpb文件打包成 .bat文件或可执行文件。急觅好心人!
- java 到底用哪个编译平台好呢?
- set,list,map
- 一个混淆很多人的java机制概念问题
- 为什么说可能损失精度?
{
String str = "HiHelloWorld";
char[] ch = str.toCharArray();
StringBuffer sbB = new StringBuffer();
StringBuffer sbS = new StringBuffer();
for(char c : ch)
{
if(c<='a')
{
sbB.append(c);
}
else
{
sbS.append(c);
}
}
str = sbB.append(sbS.toString()).toString();
System.out.println(str);
}笨是笨了点,勉强实现了喵~~``
晚上回去看看去
public void ttt() {
String str = "Hello World";
StringBuffer sb = new StringBuffer(str);
char[] ch = str.toCharArray();
int pos = 0;
for (int i=0;i<ch.length;i++) {
if (Character.isLowerCase(ch[i])) {
sb.deleteCharAt(pos);
sb.append(ch[i]);
} else if (Character.isUpperCase(ch[i])) {
pos ++;
} else {
sb.deleteCharAt(pos);
}
}
System.out.println(str);
System.out.println(sb.toString());
}
char[] myChar = input.toCharArray(); int length = input.length();
char[] upperChar = new char[length];
char[] lowerChar = new char[length];
int upperIndex = 0, lowerIndex = 0;
for (int i = 0; i < length; i++) {
if (Character.isUpperCase(myChar[i])) {
upperChar[upperIndex++] = myChar[i];
}
else {
lowerChar[lowerIndex++] = myChar[i];
}
} for (int i = 0; i < upperIndex; i++) {
myChar[i] = upperChar[i];
} for (int i = 0; i < lowerIndex; i++) {
myChar[upperIndex++] = lowerChar[i];
}
String result = new String(myChar);
System.out.println(result);
{
public static void main(String[] args)
{
System.out.println("HiHelloWorld ==> HHWielloorld"; );
}
}
String str = "HiHelloWorld";
char[] c = str.toCharArray();
char[] s = new char[c.length];
int left = 0;
int right = c.length - 1;
for(int i = 0, k = c.length; i < k; i++) {
if(c[i] >= 'A' && c[i] <= 'Z') {
s[left++] = c[i];
}
if(c[k - 1 - i] >= 'a' && c[k - 1 - i] <= 'z') {
s[right--] = c[k - 1 - i];
}
}
String ss = new String(s);
System.out.println(ss);
}
}
用个算是原始的方法 不会算时间复杂度 不过我想这个复杂度肯定超出楼主的要求了 重在参与 呵呵public class Test{
public static void main(String args[]){
String str="HiHelJloWorld";
char temp;
int k=0;
char[] c=str.toCharArray();
for(int i=0;i<c.length;i++){
if(c[i]>='A'&c[i]<='Z'){
temp=c[i];
for(int j=i;j>k;j--){
c[j]=c[j-1];
}
c[k++]=temp;
}
}
System.out.print(c);
}
}
用StringBuffer去装那个字符串,小写字母入队列,留下大写字母后面加上队列里面的所有小写字母
=============================
这句话什么意思?除了原有STRING以外不许再用别的空间了?
public class TEST { public static void main(String[] args) {
String str = "HiHelloWorld";
String str2 = str.replaceAll("[a-z]","");
String str3 = str.replaceAll("[A-Z]","");
System.out.println(str2 + str3);
}}
//输出结果
HHWielloorld
满足了吗?
import java.util.*;
public class Test { public static void main(String[] args) {
Stack<String> stk = new Stack<String>();
String s="HiHelJloWorld";
String sL = "";
String sU = "";
String result = "";
char[] c = s.toCharArray();
for(int i = 0; i < c.length; i++) {
if(c[i] >= 'a' && c[i] <= 'z')
sL += c[i];
else
sU += c[i];
}
stk.push(sL);
stk.push(sU);
while(!stk.isEmpty()) {
result += stk.pop();
}
System.out.println(result);
}}
满足:
把一个字符串中大写字母排列到前面,小写字母排列到后面。
就干这个,NOTICE,不需要排序,也别整Set那些玩意,显得低能。不过不满足:
"HiHelloWorld" ==> "HHWielloorld"; ==
code:
public class TestMain {
public static void main(String [] args){
TestMain tm = new TestMain();
tm.swapStr();
}
private void swapStr(){
String str = "HiHelloWorld";
char [] c = str.toCharArray();
int max = str.length()-1;
int start = 0;
int end = max;
while (start < end){
while(c[start]>= 'A' && c[start]<='Z'){
start++;
}
while (c[end]>= 'a' && c[end] <= 'z'){
end--;
}
if (start<end){
char tmp = c[start];
c[start] = c[end];
c[end] = tmp;
}
}
String out = new String(c);
System.out.println(out);
}
}
{
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++)
{
char lowercase = chars[i];
if( lowercase >= 97 && lowercase <= 122 )
{
for(int j = i; j < chars.length; j++)
{
char capital = chars[j];
if(capital >= 65 && capital <= 90)
{
chars[i] = capital;
chars[j] = lowercase;
break;
}
}
}
}
return new String(chars);
}
#include <stdio.h>
#define UPPERCASE(c) (c>='A'&&c<='Z')
#define LOWERCASE(c) (c>='a'&&c<='z')
main()
{
char str[]="HiHelloWorld";
int i=0,start=0,end=0;
/*计算字符串长度*/
while(str[i++]!='\0')
end++;
end--;
while(start!=end)
{
if(UPPERCASE(str[start])&&LOWERCASE(str[end]))
start++,end--;
else if(UPPERCASE(str[start])&&UPPERCASE(str[end]))
start++;
else if(LOWERCASE(str[start])&&LOWERCASE(str[end]))
end--;
else
{
char cTemp;
cTemp=str[start];
str[start++]=str[end];
str[end--]=cTemp;
}
}
i=0;
while(str[i]!='\0')
{
printf("%c",str[i++]);
}
putchar('\n');
}
用String就更离谱了,String的+=是一个多么耗费的过程啊。
诸位,算法不是为了看着好看的,要追求好的,合理的时间,空间复杂度。
你们可以把这个问题发到.Net版,和C++版,你看看他们会给出什么样的答案?
这个题目最佳的结果是不需要开辟一个Buffer,也不需要两层的循环,只要在一个数组之内就可以完成了。
我都提示到这个份上了
同样所有的条件都满足,算法时间效率和空间效率都为O(n),只有"HiHelloWorld" ==> "HHWielloorld"不满足,如果非得变成这样,只有增加辅助空间了,但也不会超O(nlogn)。只需在交换时将小写字母保存到数组中,循环结束后,再统一将小写字母插入即可。
修改后的算法均符合楼主的要求。
======
其实, 我并不大懂java,用的只是数据结构中排序常用的 merge, 算法复杂度 时间:O(n),空间 O(n+1). :) qzmguy:
呵呵, 想法一样,这个还是比较常见的 :)
终于明白了....
char[] c = str.toCharArray();
int max = str.length() - 1;
int start = 0;
int end = max;
while (start < end) {
if(c[start] > c[end] && c[start] >= 'a' && c[end] <= 'Z') {
char tmp = c[start];
c[start] = c[end];
c[end] = tmp;
start++;
end--;
} else if(c[start] <= 'Z'){
start++;
} else if(c[end] >= 'a') {
end--;
} }
System.out.println(c);
改了下33楼的 貌似不需要多while 首尾交换 一个char[]
str[end]=str[start]-str[end];
str[start]=str[start++]-str[end--];
这总行了吧,典型的用时间换空间啊
字符串长度如果是N,那么循环的次数应该大概就是N的。里面大概会出现一次判断和一次交换。这个就是效率。
PS:
可以找找Greta正则的实现看看,或者Python,Ruby的源码,里面都有正则的实现。
也应该知道StringBuffer的结构和工作原理。
而且你也很自信,我不用编译你的代码了。
如果是的话,可以用循环加二分发把for i 0-〉字符数组长(O(n)) {
if i处字符是小写 {
二分法查大写字母(O(logn))
交换字母
}
}
恩,不敢驳甘草的意思...只是...C的话我一定也是这么写,因为我没办法
JAVA我一定不这么写,因为我想偷懒
我觉得如果从后边向前推进找大写字符不如用二分法在剩下的(start之后的)字串里找快。
不知道大家什么感觉。
恩,怎么说呢,我学JAVA始终是为了方便
恩...不敢驳甘草的意思
但是如果是用C的话,当然我还会点.我也会用数组去实现,因为我不知道其他办法了
但是如果是JAVA,我一定不用数组实现,毕竟用其他方法至少在写代码的人而言方便了很多,看的人也方便很多
在数组中的穿梭始终有些个不烦琐
呵呵, 你说得对,其实这样是降低效率...考智力题才会这么做,真的项目开发,我想没有人会这么做.
public static void main(String[] args) {
char[] charAry = {'H','i','H','e','l','l','o','W','o','r','l','d'};//打好久
String str = "" ;
int index = 0 ;
while(index < charAry.length){
if((int)charAry[index] < 91) //ascii Z=90
System.out.print(charAry[index++]);
else
str += charAry[index++] ;
}
System.out.print(str);//剩下小寫的字
}
不排序的意思 就是 AbcD的 结果可以是ADbc 或者 是 ADcb ?
条件:把一个字符串中大写字母排列到前面,小写字母排列到后面。
结果应是:HHWAielloorld但是38楼的结果是:AHHWlloeorldi根据不符合题意的要求!“i”是第一个出现的,应在小写字母的第一个,我想应该不是最后一个吧。
hh hh = new hh();
char []a=new char[hh.m.length()];
StringBuffer sb=new StringBuffer();
StringBuffer sp=new StringBuffer();
String jieguo=new String();
for (int i = 0; i < hh.m.length(); i++) {
a[i]= hh.m.charAt(i);
if (Character.isUpperCase(a[i])) {
sb.append(a[i]);
}
else{
sp.append(a[i]);
}
}
jieguo=sb.toString()+sp.toString();
System.out.println(jieguo);
}}
5楼加3楼就是这样,我不知道比用StringBuffer 更简洁的方法
attention!!!
呵呵, 你说得对,其实这样是降低效率...考智力题才会这么做,真的项目开发,我想没有人会这么做.
___________________________________________________________________________________________
在数据量小的时候,往往不察觉。
有些代码看似和qz的很相似了,你干吗不在循环那里用个变量记录循环的次数呢?
你会发现你们的代码的循环次数可以用天壤之别来形容。你们看到了count后,就会真切地体会到n和n^2,和n*log(n)的差别了。
还有那个StringBuffer的,要我说多少遍?简洁的代码参加洁癖家庭妇女代码大赛去。我只要效率,时间,空间。
java不能成为追求效率极致的障碍和借口
实际条件和时间允许的话 尽量往人为最大化方向靠喽
怎么可能没说呢示例是:"HiHelloWorld" ==> "HHWielloorld",这个就是按原序排的。结果不是:WHHdlroolli 这样子的(因为不考虑顺序这个也是正确的,但是这样的结果会有 N 种,
我认为这种根本不符合题意)。
呵呵, 你说得对,其实这样是降低效率...考智力题才会这么做,真的项目开发,我想没有人会这么做.
___________________________________________________________________________________________
在数据量小的时候,往往不察觉。
有些代码看似和qz的很相似了,你干吗不在循环那里用个变量记录循环的次数呢?
你会发现你们的代码的循环次数可以用天壤之别来形容。你们看到了count后,就会真切地体会到n和n^2,和n*log(n)的差别了。
===我的算法nlog(n)以上?仔细看一下吧 :)
{
String str = "HiHelloWorld";
int sizeB=0;
char[] ch = str.toCharArray();
int[] inB = new int[ch.length+1];
for(int i=0;i<ch.length;i++)
{
if(ch[i]<='a')
{
inB[sizeB] = i;
sizeB++;
}
}
for(int i=0;i<sizeB;i++)
{
if(i!=inB[i])
{
char ex = ch[i];
ch[i]=ch[inB[i]];
ch[inB[i]]=ex;
}
}
System.out.println(String.valueOf(ch));
}
又改了下,这个时间上好了点,不过空间需要一个记录大写字母编号的数组,而且小写字母顺序变了喵~~`
{
String str = "HiHelloWorld";
int sizeB=0;
char[] ch = str.toCharArray();
int[] inB = new int[ch.length+1];
for(int i=0;i <ch.length;i++)
{
if(ch[i] <='a')
{
inB[sizeB] = i;
sizeB++;
}
} for(int i=0;i <sizeB;i++)
{
if(i!=inB[i])
{
char ex = ch[i];
ch[i]=ch[inB[i]];
ch[inB[i]]=ex;
}
}
System.out.println(String.valueOf(ch));
}
忘记加框了喵~~`
"HiHelloWorld" ==> "HHWielloorld";
这还不是坑人么?
否则一个划分算法不是完了么?但却没办法出这个结果
我搞笑幾吧
你說無所謂順序
那直接random他 運氣好的話就是大寫在前小寫在后,速度又夠快
當然,那要你rp好才行。
==========
按你的題目的話我覺得還是30樓好
我是按我的角度來說的,代碼少,看得懂,符合java的思想
畢竟你題目里又沒說要求效率
"HiHelloWorld" ==>"HHWielloorld"; 这个完全是误导
你说是"HiHelloWorld" ==>"HWHielorldlo";你要的答案早就有了
#include<iostream>
using namespace std;
bool insertFront(char* p,int size, int idx1, int idx2)
{
if(idx1>size-1 || idx2>size-1 || idx2<idx1)
return false;
char a=*(p+idx2);
for(int i=idx2; i>idx1; i--)
{
*(p+i)=*(p+i-1); }
*(p+idx1)=a; return true;
}
int main()
{
char test[]={"HiHelloWorld"};
char tmp;
int n=0; for(int i=0; i<sizeof(test)-1; i++)
{
if(*(test+i)<'a')
{
tmp=*(test+i);
*(test+i)=*(test+n);
*(test+n)=tmp;
insertFront(test,sizeof(test),n+1,i);
n++; } }
cout<<test<<endl;
return 0;
}
完成题意只要一个循环,而且次数不会超过字符串的长度。
Java版平时都是很讲效率和算法的嘛,不要一到做题的时候又来扯可读性。
就这样,看懂38楼的代码吧。
public static void main(String args[]){
String str="HiHelJloWorld";
char temp;
int k=0;
char[] c=str.toCharArray();
for(int i=0;i<c.length;i++){
if(c[i]>='A'&c[i]<='Z'){
temp=c[k];
c[k]=c[i];
c[i]=temp;
k++;
}
}
System.out.print(c);
}
}
这样不是很简单吗
public class Test { public static void main(String[] args) throws Exception {
String str = "HiHelloWorld";
final int length = str.length(); char temp[] = new char[length];
int front = 0;
int back = length - 1;
for (int i = 0; i < length - i; ++i) {
if (Character.isLowerCase(str.charAt(i))) {
temp[back--] = str.charAt(i);
} else {
temp[front++] = str.charAt(i);
} if (Character.isLowerCase(str.charAt(length - i - 1))) {
temp[back--] = str.charAt(length - i - 1);
} else {
temp[front++] = str.charAt(length - i - 1);
}
}
str = new String(temp);
System.out.println(str);
}
}