字符串反转C#的实现
字符串反转是面试过程中出现频率较高的算法题,今天一个牛同事让我用C#帮他实现这个算法,前提当然是不能使用类库。
例如: how are you 的反转结果为 you are how.
算法1: 是我当场写的一个不太理想的算法,虽然不太理想,但思路很直接:
1. 申请一个新的字符数组,新字符数组大小与源字符串等长度。
2. 将源字符串从末尾向前端进行遍历。将每一个单词加入新字符数组。
使用变量count记录当前单词长度。即,
若字符非空格,count++;
若字符是空格,则将原数组从当前位置开始的count个字符加入到新数组中。
static void Main(string[] args)
{
string testString = "how are you"; var result = reverseString(testString); } static char[] reverseString(string value)
{ if (string.IsNullOrEmpty(value))
return new char[] { }; int length = value.Length;
char[] result = new char[length];
int count = ;
int rIndex = ;
for (int i = length-; i>=; i--)
{
if(value[i]!=' ')
{ count++; } if(value[i]==' ')
{
int index = i + ;
for(; index< i+count+; index++)
{
result[rIndex++] = value[index];
}
count = ;
result[rIndex++] = ' ';
} } // fot the first word
foreach (char c in value)
{
if (c != ' ')
result[rIndex++] = c;
else
break;
} return result;
} }
算法2: 今天下班前,又花了1个小时重新考虑了这个问题,其实要实现空间开销最小,时间复杂度最低,可以实现一个字符数组反转程序。 思路如下:
1. 先将整个元字符数组反转, 得到 uoy era woh.
2. 再将每个单词进行反转, 同样使用空字符分割单词。
注意:字符数组反转函数,1. 不需要遍历所有字符,仅仅遍历二分之一的字符即可。 2. 用left, right控制字符数组中反转字符的起始位置。
namespace reverseWords
{
/// <summary>
/// Qijie Xue
/// </summary>
class Program
{
static void Main(string[] args)
{
string testData = "how are you now";
var result = reverseString2(testData);
} static char[] reverseString2(string value)
{
char[] ochr = value.Trim().ToString().ToArray();
ochr = reverseChar(ref ochr, , ochr.Length - ); int start = ;
int end = ;
for(int i = ; i<ochr.Length; i++)
{
if(ochr[i]==' ')
{
end = i - ;
reverseChar(ref ochr, start, end);
start = i + ;
} if(i==ochr.Length - )
{
end = ochr.Length - ;
reverseChar(ref ochr, start, end);
}
} return ochr;
} static char[] reverseChar(ref char[] ochr, int left, int right)
{
int mid = (right + left) >> ; int l = ;
int r = ; //even numbers, l = mid, r = mid + 1
//odd numbers, l = mid - 1, r = mid + 1
if ((right - left + ) % == )
{
l = mid + ;
r = mid;
}
else
{
l = r = mid;
} while (l > left)
{
l--;
r++;
char tchr = ochr[l];
ochr[l] = ochr[r];
ochr[r] = tchr;
} return ochr;
} }
}
以上两种算法,都需要将源字符串两端的空字符去掉。
字符串反转C#的实现的更多相关文章
- Java算法之字符串反转分析
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在基本的工作内容开发中,算法不会显得那么重要,而在百万级别的时候,差距非常大,今天带大家研究下常见的 ...
- 字符串反转----将this is good 转化为good is this 输出。
思路:现将整个字符串反转,再将每个单词反转: #include "iostream" #include "cstring" using namespace st ...
- 趣味算法:字符串反转的N种方法(转)
老赵在反对北大青鸟的随笔中提到了数组反转.这的确是一道非常基础的算法题,然而也是一道很不平常的算法题(也许所有的算法深究下去都会很不平常).因为我写着写着,就写出来8种方法……现在我们以字符串的反转为 ...
- Java实现字符串反转的8种方法
/** * */ package com.wsheng.aggregator.algorithm.string; import java.util.Stack; /** * 8 种字符串反转的方法, ...
- 使用SQL字符串反转函数REVERSE巧妙实现lastindexof功能
要实现一个简单的业务: 使用SQL脚本获取字符串'large/020700/61970b0101.jpg' 中的'61970b0101.jpg'部分. 先想到的是C#中的lastindexof,但是S ...
- 字符串反转实现(C++)
字符串反转 C++实现,不使用系统函数: // ReverseString.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include ...
- Java实现字符串反转
替换原则:index k 的值和 n-k 的值进行交换.(始终记住程序员的n.k都是字符串的实际位置.) 乘除的最基本实现还是来源于移位操作. public String reverse(String ...
- java几种字符串反转
java实现的字符串翻转,能想到的这几种方法 假设有其它方法,欢迎交流 //字符串反转 public class ReverseString { public String reverse1(Stri ...
- 有意思的字符串反转(JavaScript)
有意思的字符串反转 如果问你,实现对一串字符串进行反转操作,你的第一反应的方法是? 第一个我想到的是,利用Array.Reverse来实现: var test = 'Skylor.min'; test ...
随机推荐
- Ecshop 后台增加一个左侧列表菜单menu菜单的方法
Ecshop 后台增加一个左侧列表菜单menu菜单需要修改三个文件:/admin/includes/inc_menu.php/admin/includes/inc_priv.php/languages ...
- Chome v42 支持Java
从ver42开始,Chrome默认禁用了NPAPI.可以去chrome://flags/#enable-npapi开启,但是google很有可能在9月从代码中彻底移除NPAPIFirefox也有这个意 ...
- Javascript模块化规范
Javascript模块化规范 一.前端js模块化由来与演变 CommonJS 原来叫 ServerJS,推出 Modules/1.0 规范后,在 Node.js 等环境下取得了很不错的实践.09年下 ...
- (转)spring boot注解 --@EnableAsync 异步调用
原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Co ...
- Eclipse中10个最有用的快捷键组合
Eclipse中10个最有用的快捷键组合 (转) 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...
- C盘更改文件夹权限
现象:点“安全”添加用户并允许所有权限后,点击“应用”,弹出“无法保存对xxxxx权限所在的更改.拒绝访问”对话框 解决方法:点击“安全”-->"高级"-->“所有者” ...
- js正则实现二代身份证号码验证详解
js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...
- codeblocks个性化配置
1.general setting设置默认字体大小设置控制台字体大小:"Settings -> Environment -> View -> Message logs' f ...
- 【译】Android 6.0 Changes (机翻加轻微人工校对)
Android 6.0 Changes In this document Runtime Permissions Doze and App Standby Apache HTTP Client Rem ...
- RHEL7修改swappiness
linux系统swappiness参数在内存与交换分区间优化 2014-08-14 10:24:19分类: Linux swappiness的值的大小对如何使用swap分区是有着很大的联系的.swap ...