Topic: 【求助】一道字符串处理的编程题

  Print this page

1.【求助】一道字符串处理的编程题 Copy to clipboard
Posted by: Kappa
Posted on: 2005-09-27 09:01

昨天做到一道题, 要求: 命令行输入任意字符串, 写两个函数完成以下功能.
encode():
1. 如果当前字符是数字字符并且不大于0, 简单复制至新字符串;
2. 如果当前字符是数字字符并且无后继字符, 简单复制至新字符串;
3. 如果当前字符是大于0的数字字符并且有后继字符, 设当前字符的值为n, 将其后继字符复制n+1次至新字符串;
4. 每进行一次操作, 在不同组词之间要添加下划线'_'; 如当前字符无后继字符则不添加;
5. 如果当前字符是下划线'_', 则复制"\UL"至新字符串.

decode():
将encode()处理过的字符串在转回原字符串.

e.g.: 原字符串 23s0_d41
目标字符串 333_ssss_s_0_\UL_d_11111_1

大家帮忙看看, 谢谢了.

2.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: bluecrystal
Posted on: 2005-09-27 09:05

老兄,先自己尝试一下,好吗?
这样子的学习方式,不太好噢Wink

3.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: Kappa
Posted on: 2005-09-27 09:16

我自己当然试过了, 没弄出来才问的啊.

4.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: intothehit
Posted on: 2005-09-27 10:12

感觉这种问题应从数据结构方面考虑

5.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: bluecrystal
Posted on: 2005-09-27 11:39

仅针对该例子写的一段代码
没有经过严格测试,仅仅供学习交流
运行环境: xp pro sp2 jdk1.4

package com.jiuzhai.blue.test;

public class StrCode {

  /**
   * Encode a string
   * @param str
   * @return
   */
  public static String encode(String str) {
   StringBuffer newStr = new StringBuffer();
   int len = str.length();
   for(int i=0; i<len; i++) {
     char first = str.charAt(i);
     if(first == '0') {
       newStr.append(first);
       if((i+1) < len) {
        newStr.append("_");
      }
       continue;
     }
     
     if((first > '0') && (first <= '9')) {
      if((i+1) >= len) {
        newStr.append(first);
        break;
      } else {
        int iRepeat = Integer.parseInt(String.valueOf(first)) + 1;
        for(int j=0; j<iRepeat; j++) {
          newStr.append(str.charAt(i+1));
        }
        newStr.append("_");
      }
      continue;
     }
     
     if(first == '_') {
       newStr.append("\\UL");
       if((i+1) < len) {
        newStr.append("_");
      }
       continue;
     }
     
     //default
     newStr.append(str.charAt(i));
    if((i+1) < len) {
     newStr.append("_");
   }
   }
   return newStr.toString();
  }
  
  /**
   * Decode a string
   * @param str
   * @return
   */
  public static String decode(String str) {
    StringBuffer newStr = new StringBuffer();
    String[] strs = str.split("_");
    int len = strs.length;
    for(int i=0; i<len; i++) {
if(strs[i].length() == 1) {
  newStr.append(strs[i]);
  continue;
}

if("\\UL".equals(strs[i])) {
  newStr.append("_");
  continue;
}
int iLen = strs[i].length();
newStr.append(String.valueOf(iLen-1));
    }
    return newStr.toString();
  }
  
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
//get input string
    if(args.length == 0) {
      System.out.println("input a string, plz!");
     return;  
    }
    if(args.length > 1) {
     System.out.println("The parameter is too many, exit!");
      return;  
    }
    String ori = args[0];
    System.out.println("before: " + ori);
    String enc = encode(ori);
    System.out.println("after: " + enc);
    String dec = decode(enc);
    System.out.println("decode: " + dec);
  }

}



测试用例输出:

before: 23s0_d41
after: 333_ssss_s_0_\UL_d_11111_1
decode: 23s0_d41

6.Re:【求助】一道字符串处理的编程题 [Re: bluecrystal] Copy to clipboard
Posted by: Kappa
Posted on: 2005-09-27 11:47

ft, 一时想错了, 总想着转数值型, 谢谢版主了.

7.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: bluecrystal
Posted on: 2005-09-27 11:56

Kappa wrote:
ft, 一时想错了, 总想着转数值型, 谢谢版主了.


没关系,以后多思考就是了
Smile

8.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: panther
Posted on: 2005-09-28 21:28


import java.io.BufferedReader;
import java.io.IOException;
//import java.io.InputStream;
import java.io.InputStreamReader;
/*
* 创建日期 2005-9-27
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/

/**
* @author firefox
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/

public class Transform {

  static void Encode(String i){
    int m,n,x;
    StringBuffer char_final=new StringBuffer();
    
    m=i.length();
    System.out.println("您输入的字符串长度为"+m);
    for(n=0;n<m;n++)
    {char current_char=i.charAt(n);
    
     if((current_char>=48)&&(current_char<=57))//是数字时
     {if(n==m-1) //如果是最后一个字符
        {char_final.append(current_char);}
     else if(current_char==48) //如果是0且不是最后一个字符
     {char_final.append(current_char);
     char_final.append("_");}
     else
     {for(x=49;x<=i.charAt(n)+1;x++)
       {char_final.append(i.charAt(n+1));}
     char_final.append("_");
     }
     }
     else if(((current_char>=65)&&(current_char<=90))||
          ((current_char>=97)&&(current_char<=122)))//是字母时
     {char_final.append(current_char);
     if(n!=m-1) char_final.append("_");}
     else if(current_char==95)
     {char_final.append("\\ul");
     if(n!=m-1) char_final.append("_");}
     else
     {char_final.append(current_char);
     if(n!=m-1) char_final.append("_");}
     }
    
    System.out.println("您选择的是加密!");
    System.out.println("加密后的字符串为:"+char_final);
    
    
    }
  static void Decode(String original_char){
    System.out.println("您选择的是解密!");
    int m,n;
    int last_index=-1;
    int current_index=0;
    StringBuffer char_final=new StringBuffer();
    StringBuffer temp_char=new StringBuffer(original_char);
    temp_char.append("_");
    String i=temp_char.toString();
        
    m=i.length();
    
    for(n=0;n<m;n++)
     {
     char current_char=i.charAt(n);
     if(current_char==95)

     {current_index=n;
     if(current_index-last_index>2)
       {if(i.charAt(n-1)!=i.charAt(n-2))
        {char_final.append("_");}
        else
        {char_final.append(current_index-last_index-2);
        }
        }
     else if(current_index-last_index==2)
     {char_final.append(i.charAt(n-1));
        }
     }
       
     }
    System.out.println("您解密后的字符串为:"+char_final);   
      }    
  
  public static void main(String[] args) throws IOException {
    String char_original;
    String choose;
    System.out.println("请输入需要转换的字符串:");
    BufferedReader buf_reader1=new BufferedReader(new InputStreamReader(System.in));
   char_original=new String(buf_reader1.readLine());
   System.out.println("请选择Encode或者Decode");
    BufferedReader buf_reader2=new BufferedReader(new InputStreamReader(System.in));
   choose=new String(buf_reader2.readLine());
   if(choose.equals("Encode")||choose.equals("encode"))
     Encode(char_original);
   else if(choose.equals("Decode")||choose.equals("decode"))
     Decode(char_original);
   else
     System.out.println("您的输入有误");
  
   }
  
}


有一个问题:当解密的字符串中连续出现“_”时,我一时想不出好的解决办法。

初学者,对很多方法都不太掌握,编出来的,象C,呵呵。

9.Re:【求助】一道字符串处理的编程题 [Re: Kappa] Copy to clipboard
Posted by: why
Posted on: 2005-09-28 22:05

Kappa wrote:
我自己当然试过了, 没弄出来才问的啊.

那麼閣下應該先簡略地說說試過甚麼,有哪些問題.

10.bluecrystal同学程序存在一个小bug [Re: Kappa] Copy to clipboard
Posted by: Python
Posted on: 2005-10-13 12:21

bluecrystal同学程序存在一个小bug,
当输入的字符串中,数字与“_”相连时,
encode会把“_”重复n+1次,
decode时,则把这n+1个“_”当作分隔符了。

eg.输入“6_f”

11.Re:bluecrystal同学程序存在一个小bug [Re: Python] Copy to clipboard
Posted by: bluecrystal
Posted on: 2005-10-13 12:59

Python wrote:
bluecrystal同学程序存在一个小bug,
当输入的字符串中,数字与“_”相连时,
encode会把“_”重复n+1次,
decode时,则把这n+1个“_”当作分隔符了。

eg.输入“6_f”

谢谢指出bug
我本来就没有严格测试过,就是把楼主的测试用例试了一下,对了,就发出来了
Big Smile


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923