一道面试题!!求解

问题描述

一个8位的字符串例如:abcdefgh, 截取他末尾成对出现的0,例如10000000 截取后的结果:1012345600 截取后的结果:123456 12340000 截取后的结果是:123410000001:则不做截取操作10101010:则不做截取操作问题补充litianyu0815 写道

解决方案

kidneyball 写道s = s.replaceAll("(00)*$","");貌似没做到楼主的要求嘛
解决方案二:
public static void main(String[] args) throws Exception {System.out.println(trimTailCoupleZero("100000"));System.out.println(trimTailCoupleZero("00000"));System.out.println(trimTailCoupleZero("0000"));System.out.println(trimTailCoupleZero("10000000"));System.out.println(trimTailCoupleZero("12345600"));System.out.println(trimTailCoupleZero("12340000"));System.out.println(trimTailCoupleZero("10000001"));System.out.println(trimTailCoupleZero("10101010"));}public static String trimTailCoupleZero(String str) {int n = str.length() - 1;int index = n;for (; index >= 0; index--) {if (str.charAt(index) != '0')break;}if (((n - index) & 1) != 0) {index++;}if (n == index)return str;elsereturn str.substring(0, index + 1);}不用递归,substring方法最多也只要调用一次
解决方案三:
bf2624 你的代码也太那个啥了吧?你知道你这样子会产生多少个String对象吗?而且subString会进行native方法调用,JNI查找本地方法时的查找要用时间的,性能的话还是要考虑的。还是kidneyball的指针移动比较好。
解决方案四:
……public static void main(String[] args){String a = "1000000";for(int i=0;i<a.length();i++){if(a.endsWith("00")){a = a.substring(0,a.length()-2);System.out.println(a);}else{break;}}}
解决方案五:
这算法不用这么罗嗦吧~public static void main(String[] args){String a = "werwr00000";for(int i=0;i<a.length()/2;i++){if(a.endsWith("00")){a = a.substring(0,a.length()-2);}else{break;}System.out.println(a);}}
解决方案六:
你们都是刚工作啊?
解决方案七:
zkl_1987 写道kidneyball 写道s = s.replaceAll("(00)*$","");貌似没做到楼主的要求嘛符合要求,没错啊。去掉末尾成对的0。
解决方案八:
zkl_1987 写道kidneyball 写道s = s.replaceAll("(00)*$","");貌似没做到楼主的要求嘛例如哪个输入数据?
解决方案九:
kidneyball 写道不用正则的方案 :public class RemoveDoubleZero {public static String removeDoubleZero(String s) {int i;for (i = s.length(); i > 2 && s.charAt(i - 1) == '0' && s.charAt(i - 2) == '0'; i -= 2);return s.substring(0, i);}public static void main(String[] args) {System.out.println(removeDoubleZero("1"));System.out.println(removeDoubleZero("10"));System.out.println(removeDoubleZero("100"));System.out.println(removeDoubleZero("1000"));System.out.println(removeDoubleZero("10000"));}}向你学习了。
解决方案十:
while(str.endwith("00")){ str = str.substring(0,str.length()-2);}
解决方案十一:
kidneyball 写道不用正则的方案 :public class RemoveDoubleZero {public static String removeDoubleZero(String s) {int i;for (i = s.length(); i > 2 && s.charAt(i - 1) == '0' && s.charAt(i - 2) == '0'; i -= 2);return s.substring(0, i);}public static void main(String[] args) {System.out.println(removeDoubleZero("1"));System.out.println(removeDoubleZero("10"));System.out.println(removeDoubleZero("100"));System.out.println(removeDoubleZero("1000"));System.out.println(removeDoubleZero("10000"));}}上面那个比我的牛啊 连递归都没用啊
解决方案十二:
不用正则的方案 :public class RemoveDoubleZero {public static String removeDoubleZero(String s) {int i;for (i = s.length(); i > 2 && s.charAt(i - 1) == '0' && s.charAt(i - 2) == '0'; i -= 2);return s.substring(0, i);}public static void main(String[] args) {System.out.println(removeDoubleZero("1"));System.out.println(removeDoubleZero("10"));System.out.println(removeDoubleZero("100"));System.out.println(removeDoubleZero("1000"));System.out.println(removeDoubleZero("10000"));}}
解决方案十三:
kidneyball 写道s = s.replaceAll("(00)*$","");
解决方案十四:
2楼的好简洁呀
解决方案十五:
这个应该不难,去查下api,感觉类似2楼的正则表达式会比较好
其他方案:
litianyu0815 写道public static void main(String[] args) {// TODO Auto-generated method stubString str = "1234570000";String str1 = "12340001";String str2 = "12342000";System.out.println(subDoubleZero(str));System.out.println(subDoubleZero(str1));System.out.println(subDoubleZero(str2));}public static String subDoubleZero(String str) {for (int i = str.length() - 1; i > 0; i--) {char c1 = str.charAt(i - 1);char c2 = str.charAt(i);if (c1 == '0' && c2 == '0') {String testStr = str.substring(0, i - 1);return subDoubleZero(testStr);}return str;}return str;}
其他方案:
public static void main(String[] args) {// TODO Auto-generated method stubString str = "1234570000";String str1 = "12340001";String str2 = "12342000";System.out.println(subDoubleZero(str));System.out.println(subDoubleZero(str1));System.out.println(subDoubleZero(str2));}public static String subDoubleZero(String str) {for (int i = str.length() - 1; i > 0; i--) {char c1 = str.charAt(i - 1);char c2 = str.charAt(i);if (c1 == '0' && c2 == '0') {String testStr = str.substring(0, i - 1);return subDoubleZero(testStr);}return str;}return str;}
其他方案:
s = s.replaceAll("(00)*$","");

时间: 2024-09-08 09:33:21

一道面试题!!求解的相关文章

当当的一道面试题求解

问题描述 用多线程的方式,将A表中的数据复制到相同结构的B表.数据量很大,要求速度.A表结构ID, NAME,STATuS(复制到B表的状态)问题是怎么能保证多线读A表的时候,不会读到重复的数据.不能用同步关键字.当时没想出好的方法,不知道大家有什么好的思路没有. 解决方案 举例子1.搜索到1000条数据2.根据ID进行hash运算,最简单方式取余3.根据hash运算以及你的CPU内核,execute创建线程池4.然后根据hash运算后的结果,分配到不同线程5.创建异步任务,任务submit6.

嵌入式面试题求解:给你一个8M连续内存,如何管理使用

问题描述 嵌入式面试题求解:给你一个8M连续内存,如何管理使用 给你一个8M连续内存,如何实现申请和释放,请考虑所有情况,给出最好的实现. 解决方案 可以参考操作系统原理里面说的分页.分段的方式来使用.不存在最好的实现,要考虑性能和利用率,如果希望利用率大,那么性能必然要影响,反之,如果要高效,就得牺牲一些存储效率. 解决方案二: 可以用全局二位字节数组占用掉,然后采用一定的算法管理这些分配掉的内存块,来实现简单的内存分配管理,参考uCOS-II的实现. 解决方案三: 双向链表控制 设置最小si

一道面试题(关于千万量级数据结构排序)

问题描述 一道面试题(关于千万量级数据结构排序) 题目: 已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名.考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中. 格式 如下: 李四,201008823,678: 张三,201007432,356: 王五,201322233,464: 排序后: 李四,201008823,678: 王五,201322233,464: 王五,201322233,464: 要求:使空间复杂度和时间

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

初始化顺序-今年阿里巴巴的一道笔试题

问题描述 今年阿里巴巴的一道笔试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

结构体定义-如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题。

问题描述 如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题. Node包含50个字符.

从一道面试题说去

    有一道面试题: 给定n个整型数,怎样让这n个数的使用空间最小.      ok,我们都知道在32位的机器下,int类型的数占4个字节,因此n个数总的使用空间应该是4n.(64位不做解释)那我们怎么样才能使得n个数字的使用空间最小呢?     一. 我们先来看一个例子           假设现在有3个数,1,2,3.           我们都知道数字最后都是以二进制的方式存储的,我们可以表示出1,2,3的二进制           1: 0000 0000 0000 0000 0000

《Wireshark网络分析就这么简单》—从一道面试题开始说起

从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精

《大咖讲Wireshark网络分析》—从一道面试题开始说起

从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精英们难住.本文要介绍的便

一道面试题:布尔变量

FROM:酷壳 下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:"如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true",于是LZ做了下面的这样的程序: boolean atLeastTwo(boolean a, boolean b, boolean c) { if ((a && b) || (b && c) || (a && c)) { return true; } else { r