我最近在一次采访中被问过这个问题(3次以上经历)。不允许包含String.length
的字符串函数。我有5分钟的时间来编写完整的代码。
示例
String ="abcfedbca"
subString = "fed"
实际上我要求他详细说明一下他说“这很容易实现我应该详细说明的内容”,并且基于这个问题,他说我的核心java非常弱。
答案 0 :(得分:3)
请注意,您的问题不是很精确,因此您的要求不是很清楚。
简单方法:
String st = new StringBuilder(s).substring(3,6);
或者您可以使用反射直接构造新的String
来获取char
数组:
public static String substring(String s, int from, int to){
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
char [] tab = (char[])f.get(s);
f.setAccessible(false);
return new String(tab, from, to - from);
}
<小时/> 这些也可以是选项(请注意,仅当原始
String
符合十六进制格式时才有效):
String s ="abcfedbca";
BigInteger bi = new BigInteger(s, 16);
bi = bi.and(new BigInteger("16699392")); //0xfed000 in hexa
bi = bi.shiftRight(12);
System.out.println(bi.toString(16));
或者更简单:
String s ="abcfedbca";
System.out.println(Integer.toHexString((int)(Long.parseLong(s, 16) & 16699392) >> 12));
如果你想要一个更通用的方法,这个方法可能适合你的情况:
public static void main(String [] args){
String s ="abcfedbca";
System.out.println(substring(s, 2, 5, 9));
}
public static String substring (String s, int from, int to, int length){
long shiftLeft = 0;
long shiftRight = (length - to - 1) * 4;
for(int i = 0; i < to - from - 1; i++){
shiftLeft += 15;
shiftLeft = shiftLeft << 4;
}
shiftLeft += 15;
return Long.toHexString((Long.parseLong(s, 16) & (shiftLeft << shiftRight)) >> shiftRight);
}
答案 1 :(得分:2)
您可以使用StringBuilder
并在其上调用substring
。不知道是否允许这样做。
这是另一种方式(尽管我对此解决方案感到羞耻):
String str = "abcfedbca";
int from = 3, length = 3;
java.lang.reflect.Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] value = (char[]) valueField.get(str);
char[] sub = new char[length];
System.arraycopy(value, from, sub, 0, length);
String substring = new String(sub);
答案 2 :(得分:1)
String buff = "abcfedbca";
System.out.println("substring is = " + buff.substring(3, 6));
怎么样?
答案 3 :(得分:0)
StringBuilder似乎是骗人的,因为它基于字符串。我认为你必须深入到字节原语以满足测试的精神。当然这会调用getBytes
,这在技术上是一个String函数,所以也会打破它。
public static void main(String[] args) {
String full ="abcfedbca";
String desiredsubString = "fed";
byte[] fullByte = full.getBytes();
byte[] desiredByte = desiredsubString.getBytes();
byte[] foundStorage = new byte[desiredByte.length];
boolean foundStart = false;
int inserted = 0;
for (byte b : fullByte) {
if ( !foundStart && (b == desiredByte[0]) )
{
foundStorage[0] = b;
inserted++;
foundStart = true;
}
else if (foundStart && (inserted < foundStorage.length))
{
foundStorage[inserted] = b;
inserted++;
if ( inserted >= foundStorage.length )
{
break;
}
}
}
System.out.println("These should be equal: " + new String(desiredByte).equals(new String(foundStorage)));
}
答案 4 :(得分:0)
也许:
String value = "abcfedbca";
BigInteger bi = new BigInteger(value, 16);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
bi = bi.divide(BigInteger.TEN);
int val = bi.subtract(BigInteger.valueOf(535)).intValue();
String hex = Integer.toHexString(val);
System.out.println(hex);
输出:fed
答案 5 :(得分:0)
如何使用JPasswordField来获取字符:
private static String substring(String str, int beginIndex, int endIndex) {
return new String(new JPasswordField(str).getPassword(), beginIndex, endIndex - beginIndex);
}
String构造函数不是String方法,不是吗?
答案 6 :(得分:0)
public String submethod(String data, int firstindex, int lastindex) {
char[] chars=data.toCharArray();
char[]charnew= new char [lastindex];
for(int i=firstindex; i< lastindex;i++) {
charnew[i]=chars[i];
}
return new String(charnew);
}