将字符串完全反转---大公司简单面试题--分享

无悔克难 2008-07-11 02:13:14
加精
将字符串 String oldstr="I am a programmer"完全反转为"programmer a am I",最好不用函数,自己写,当然也可以用
这样的 题目很多人写不出,真是汗啊!我是用链表实现的,但是比较繁琐,算是过关了,今天特来寻求最好的解决方案

...全文
8176 298 打赏 收藏 转发到动态 举报
写回复
用AI写文章
298 条回复
切换为时间正序
请发表友善的回复…
发表回复
海中之龙 2011-12-02
  • 打赏
  • 举报
回复
二楼。。。
他是小迷糊 2011-11-30
  • 打赏
  • 举报
回复
可以考虑循环试试
从未被超岳 2011-11-30
  • 打赏
  • 举报
回复
 String str = "I am a programmer";
String nstr = "";
String substr = "";
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) != ' ') {
substr = str.charAt(i) + substr;
if (i == 0) {
nstr = nstr + substr + " ";
break;
}
} else {
nstr = nstr + substr + " ";
substr = "";
}
}
System.out.println(nstr);

我的想法跟楼上一样 呵呵
taige 2011-11-30
  • 打赏
  • 举报
回复
public static void reverseStr3(){
System.out.println("Please enter the String:");
String str = new Scanner(System.in).next();
StringBuffer s = new StringBuffer(str);
System.out.println(s.reverse());
}
xxzf426214 2011-10-27
  • 打赏
  • 举报
回复
2楼的运行结果就可以了啊LZ。空格还是保留着原来的样子



顶2楼。给力啊
IceArmour 2011-10-20
  • 打赏
  • 举报
回复
昨天面试用正则写,貌似面试官不太满意
wuyoutianxia2 2011-09-14
  • 打赏
  • 举报
回复
代码有点长了,主要是前提不用字符串处理函数,否则的话应该很简单
公司面试都喜欢用这些奇怪的条件来难人
wuyoutianxia2 2011-09-14
  • 打赏
  • 举报
回复
家里没装JAVA环境 用得C#


private void button1_Click(object sender, EventArgs e)
{
String st = "I.am..a...programmer";//用.表示 空格


char[] cr = st.ToCharArray();

List<String> tempList = new List<string>(); //可以用其他集合

//其实完全可以用单循环,下边看的是双循环,其实是单循环
for (int i = 0; i < cr.Count(); i++)
{
String tempStr = ""; //如果数据量大不用string保存
for (int j = i; j < cr.Count(); j++)
{

if (cr[j] == '.')
{
tempList.Add(tempStr);
tempList.Add(".");
i = j;
break;
}
tempStr += cr[j];

if (j == cr.Count() - 1)
{
tempList.Add(tempStr);
}
i = j;
}
}
//输出。有很多种方法,这个是没用函数翻转的方法
for (int i = 0; i < tempList.Count(); i++)
{
this.richTextBox1.Text += tempList[tempList.Count() - i-1];
}
}


OUTPUT : programmer...a..am.I
翱翔的苍鹰 2011-09-13
  • 打赏
  • 举报
回复
看的有点晕了
呵呵
maliang18 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 possibleman 的回复:]

晕!csdn真的不厚道,我定义的 String oldstr="I am a programmer";之间的空格分别是1、2、3个,发布后都是一个,所以楼上的,可以在试一下!如果只是一个空格,那就没任何难度了
[/Quote]
空格要跟着过去么?
hq333 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 90 楼 kuria001 的回复:]
44楼果然厉害
[/Quote]
将44楼的稍作修改:
public class Test{
public static void main(String[] args){
String oldstr="I am a programmer ";
StringBuilder sb= new StringBuilder();
int index = oldstr.lastIndexOf(' ');
while (index >= 0) {
sb.append(oldstr.substring(index + 1) + ' ');
oldstr = oldstr.substring(0,index);
index = oldstr.lastIndexOf(' ');
}
sb.append(oldstr);
System.out.println(sb);
}
}
不二Se 2011-09-01
  • 打赏
  • 举报
回复
先整个字符串对称对换 再每个单词对称对换
TufeixpSearching 2011-07-13
  • 打赏
  • 举报
回复
不久前去三星面试,给了道这个纯C题目,一时没写出来,实在惭愧。现在写好了,贴上以儆效尤。
输入“shell 0” 和"shell 1" 切换两种排序方式,打开#if 0的宏用于测试执行时间。

#include "StdAfx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>

//turn "I am a student " to " student a am I" etc.
#define UINT8 char
int copy_c_blank(int *i,int *j,UINT8 *temp_string, UINT8 *temp)
{
while(*(temp_string+*i) == 0x20)
{
*(temp+*j) = 0x20;
(*j)++;
(*i)--;
if(*i < 0 )
return -1;
}
return 0;
}
int copy_string(int *i,int *j,long num,UINT8 *temp_string, UINT8 *temp)
{
int count = 0;
while((*(temp_string+*i) != 0x20) && (*i >= 0)) //find a string
{
(*i)--;
count++;
}
(*i)++; //restore index
if(count!=0)
memcpy(temp+*j,temp_string+*i,count);
*j = *j+count;
if(*i==0)
return -1;
return 0;
}
DWORD WINAPI convert_str_speed(LPVOID temp_string)
{
char *temp;
int i,j;
long num = strlen((char*)temp_string);
temp=(char *)malloc(num+1);
for(i=num-1,j=0;i!=0;i--)
{
if(copy_c_blank(&i,&j,(char*)temp_string,temp) == -1)
break;
if(copy_string(&i,&j,num,(char*)temp_string,temp) == -1)
break;
}
temp[num]=0;
memcpy((char*)temp_string,temp,num+1);
free(temp);
return NULL;
}
void roll_one_byte(int index,long num,UINT8 * inputstring)
{
UINT8 temp;
int i,j;
temp = *(inputstring+num);
for(i=index,j=0;i<num;i++,j++)
{
*(inputstring+num-j) = *(inputstring+num-j-1);
}
*(inputstring+index)=temp;
}
int check_roll_num(long num,UINT8 * inputstring )
{
int i;
for(i=0;i<num;i++)
{
if((((*(inputstring+i) ==0x20)?1:0)^(*(inputstring+i+1) ==0x20)?1:0)==1)
break;
}
return num-i;
}
DWORD WINAPI convert_str_space(LPVOID temp_string)
{
int i,j ; //i is index for actual pisition of focus; j is index for total circle.
long num = strlen((char*)temp_string)-1;
long roll_num = check_roll_num(num,(char*)temp_string);
if (num <0)
return NULL;

for(i=0,j=0;j<roll_num;)
{
roll_one_byte(i,num,(char*)temp_string);
j++;
if((((*((char*)temp_string+i) ==0x20)?1:0)^((*((char*)temp_string+num) ==0x20)?1:0))==1)
{
i=j;
}
}
return NULL;
}
bool shell(char *string,bool *tag)
{
if(strcmp(string,"shell")>0)
{
if(atoi(string+6)==0)
*tag = false;
else if(atoi(string+6)==1)
*tag = true;
return true;
}
return false;
}
__int64 FileTimeToQuadWord(PFILETIME pft)
{
return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}

int main()
{
char temp_string[102400];
bool method = false;
HANDLE hThread;
FILETIME hCreateTime,hExitTime,hKernelSTime,hUserSTime,hKernelNTime,hUserNTime;
int count;
while(1)
{
gets(temp_string);
if(shell(temp_string,&method)==true) //input = "shell [1/0]"
{
printf("change string method = %d \n",method);
}else{
printf("input string is: %s\n",temp_string);
#if 0
memset(temp_string,0x20,sizeof(temp_string));
for(count = 102380;count>2;count-=2)
temp_string[count]='f';
temp_string[102400]='\0';
#endif
printf("method is %d\n",method);

if(method == true)
{
hThread = CreateThread( NULL, 0, convert_str_speed, temp_string, 0, NULL );
if(GetThreadTimes(hThread,&hCreateTime,&hExitTime ,&hKernelSTime,&hUserSTime)==0)
{
printf("get time failed\n");
}
}
else if (method == false)
{
hThread = CreateThread(NULL, 0, convert_str_space, temp_string, 0, NULL );
if(GetThreadTimes(hThread,&hCreateTime,&hExitTime ,&hKernelSTime,&hUserSTime)==0)
{
printf("get time failed\n");
}
}
WaitForSingleObject( hThread, INFINITE);
if(GetThreadTimes(hThread,&hCreateTime,&hExitTime,&hKernelNTime,&hUserNTime)==0)
{
printf("get time failed\n");
}
CloseHandle(hThread);
printf("output string is: %s\n",temp_string);
// printf("duration = %d ms\n",(FileTimeToQuadWord(&hExitTime) - FileTimeToQuadWord(&hCreateTime))/10000);
printf("duration mod = %d ms\n",(FileTimeToQuadWord(&hKernelNTime)+FileTimeToQuadWord(&hUserNTime)-FileTimeToQuadWord(&hKernelSTime)-FileTimeToQuadWord(&hUserSTime))/10000);
}
}
}
cccap000007 2011-07-07
  • 打赏
  • 举报
回复
public class Demo {
public static void main(String[] args) {
String oldstr="I am a programmer";
String[] strArray = oldstr.split(" ");
String temp = "";
for (int i = strArray.length -1; i >= 0; i--) {
temp += strArray[i];
if(i != 0){
temp += " ";
}
}
System.out.println(temp);
}
}
BigNippleBoy 2011-05-11
  • 打赏
  • 举报
回复
TX的笔试题, 呵呵
昨天与今天 2011-05-09
  • 打赏
  • 举报
回复
//方法一
// String str = "I am a programmer";
// String temp[] = str.split(" ");
// String strtemp = "";
// for(int i = temp.length-1 ;i >=0 ;i--){
// strtemp+=temp[i]+" ";
// }
// System.out.print(strtemp);
//方法二
// String oldstr="I am a programmer";
// String[] str = oldstr.split(" ");
// String finalstr="";
// for(int i=str.length-1;i>=0;i--)
// {
// if(str[i].equalsIgnoreCase(""))
// {
// continue;
// }
// if(i==0)
// {
// finalstr=finalstr+str[i].trim();
// continue;
// }
// finalstr=finalstr+str[i].trim()+" ";
// }
// System.out.println(finalstr);
//方法三
// String oldstr = "I am a programmer";
// int index = oldstr.lastIndexOf(' ');
// while (index >= 0) {
// System.out.print(oldstr.substring(index + 1) + ' ');
// oldstr = oldstr.substring(0, index);
// index = oldstr.lastIndexOf(' ');
// }
//
// System.out.println(oldstr);
//方法四
String str = "I love java ddd";
String t[] = str.split("");
String s = "";
for (int i = t.length - 1; i >= 0; i--) {
if (!"".equals(t[i]))
s += t[i];
else
s += " ";
}
System.out.print(s);
delete2012 2011-04-18
  • 打赏
  • 举报
回复
学习了 。。。
kissjiss 2011-03-14
  • 打赏
  • 举报
回复
2楼的不错啊
realreachard 2009-10-14
  • 打赏
  • 举报
回复
好多人都贴,咱也贴一个

package algorithm.common;

import java.util.ArrayList;
import java.util.List;

public class StringReverse
{

/**
*
* @param args
*/
public static void main(String[] args)
{
String s = "I am a programmer";
reverseString(s);
}

/**
* String oldstr="I am a programmer"完全反转为"programmer a am I"
*
* 思路:将char 分为两类,空格和非空格,
*/
public static void reverseString(String str)
{
long a = System.currentTimeMillis();
char[] charArr = str.toCharArray();
List<String> wordList = new ArrayList<String>();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < charArr.length; i++)
{
stringBuffer.append(charArr[i]);
if (isSameKind(i, charArr)) {
continue;
} else {
wordList.add(stringBuffer.toString());
stringBuffer = new StringBuffer();
// stringBuffer.delete(0, stringBuffer.length());
}
}
for (int i = wordList.size()-1;i>=0;i--) {
System.out.print(wordList.get(i));
}
System.out.println();
System.out.println(System.currentTimeMillis() - a);
}

/**
* 判断当前元素i与元素i+1是不是同类
* @param i
* @param charArr
* @return
*/
private static boolean isSameKind(int i, char[] charArr)
{
return i+1 < charArr.length ? (charArr[i] == ' ' ? charArr[i + 1] == ' ' : charArr[i + 1] != ' '):false;
}

}
ziyu0103 2009-10-14
  • 打赏
  • 举报
回复
String oldstr="I am a programmer";
String temp = "";
String [] arg =new String[4];
int i = 0;
while(oldstr.indexOf(" ")>0){
temp = oldstr.substring(0,oldstr.indexOf(" "));
oldstr = oldstr.substring(oldstr.indexOf(" "),oldstr.length()).trim();
arg[i] = temp;
i++;
}
arg[i] = oldstr;
System.out.println(arg[arg.length-1]+" "+arg[arg.length-2]+" "+arg[arg.length-3]+" "+arg[arg.length-4]);
加载更多回复(275)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧