靠谱的车
题目
小明打车,出租车司机不喜欢4,改装计费表,任何出现数据4就跳过,其余功能正常
1. 23再多一块变25
2. 39再多一块变50
3. 399再多一块编程500
小明利用编程识别问题,给出计费表的表面读数,返回实际费用
输入描述:一个数据表示实际产生的费用
示例1:输入5,输出4
参考
def charge(cost:String): Unit ={
var result:Int = 0
val len:Int = cost.length
for (i<- 0 until len){
val siteNum:Int = cost.substring(i,i+1).toInt
result += Math.pow(9,len-i-1).toInt*siteNum
if(siteNum>4){
result-=Math.pow(9,len-i-1).toInt
}
}
println(result)
}
寻找相同子串
题目
给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输出改子串第一个字符的下标
输入:
AVERDXIVYERDIAN
RDXI
输出:
4
参考
String str1 = "abc";
String str2 = "123acbc456abc";
int index = -1;
for(int i = 0;i<=str2.length()-str1.length();i++) {
if(str2.substring(i, str1.length()+i).equals(str1)) {
index = i;
break;
}
}
System.out.println(str1+"在"+str2+"中第一次出现的位置是:"+index);
public class t {
private static int find(char[] str1_sz, char[] str2_sz) {
int index = -1;
if (str1_sz.length <= str2_sz.length) {
for (int i = 0; i < str1_sz.length; i++) {
for (int j = 0; j < str2_sz.length; j++) {
if (str1_sz[i] == str2_sz[j]) {
for (int k = 0; k < str1_sz.length; k++) {
if (k + 1 == str1_sz.length) {
index = j + 1;
}
}
}
if (index != -1)
break;
}
}
}
return index;
}
public static void main(String[] args) {
String str1 = "abc";
String str2 = "123acbc456abc";
char[] str1_sz=str1.toCharArray();
char[] str2_sz=str2.toCharArray();
int index=0;
if (str1.length()<=str2.length())
{
index=find(str1_sz,str2_sz);
}else
{
index=find(str2_sz,str1_sz);
}
System.out.println(str1+"在"+str2+"中第一次出现的位置是:"+index);
}
}
找终点
题目
给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,锁使用最少的步骤数,要求:
1.第一步必须从第一个元素开始,切1<=第一步的步长<len/2
2.从第二步开始,只能以所有成员的数字走相应的步数,不能多不能少,如果目标不可达返回-1
3.只能向数组的尾部走,不能往回走
输入描述:由正整数组成的数据,以空格分割,数组长度小于100
输出描述:正整数,表示最少的步数,如果不存在输出-1
示例:
输入7 5 9 4 2 6 8 3 5 4 3 9
输出 2
参考
public static void main(String[] args) {
int[] nums = {7,5,9,4,2,6,8,3,5,4,3,9};
// 记录最少步数
int minCount = -1;
for(int i = 1; i <= nums.length/2 ; i++){
// 不可达,返回-1
int len = test1( nums,i );
if( len != -1 ){
// 找最小
minCount = minCount == -1 ? len : Math.min(minCount, len);
}
}
System.out.println(minCount);
}
//
public static int test1(int[] nums,int start){
int i = start;
int count = 0;
for (; i<= nums.length ; i+=nums[i]){
count++;
// 如果超过, 返回-1, 不可达 ( 因为从第一个开始,所需要走的长度-1 )
if( i>(nums.length-1) ) return -1;
// 如果正好等于, 返回步数 ( 因为从第一个开始,所需要走的长度-1 )
if( i==(nums.length-1) ) return count;
}
return -1;
}
春游名单
题目
输入姓名+工号,英文逗号分割
输出工号中数字按照升序排序
示例:
输入:
wr0068,lt01,qhy0027828,gh20425256,xj0033258,zmj00505562
输出:
lt01,wr0068,qhy0027828,xj0033258,zmj00505562,gh20425256
参考
public static void test2(){
String str = "wr0068,lt01,qhy0027828,gh20425256,xj0033258,zmj00505562";
// 切分
String[] split = str.split(",");
// 冒泡排序
for(int i = 1 ;i<split.length ;i++) {
boolean flag = true;
for (int j = 0; j<split.length-i;j++) {
int i1 = Integer.parseInt(replaceAllNotNumber(split[j]));
int i2 = Integer.parseInt(replaceAllNotNumber(split[j+1]));
if( i1 > i2) {
String zj= split[j];
split[j]=split[j+1];
split[j+1]=zj;
flag = false;
}
}
if(flag)
break;
}
// 打印出来
for(int i = 0;i<split.length;i++){
System.out.println(split[i]);
}
}
public static String replaceAllNotNumber(String str){
StringBuffer result = new StringBuffer();
char[] chars = str.toCharArray();
for (char aChar : chars) {
// 0-9 的 ASCII
if(aChar >=48 && aChar <=57){
result.append(aChar);
}
}
return result.toString();
}
最大连续1的个数
题目
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
注意:
输入的数组只包含 0 和1。
输入数组的长度是正整数,且不超过 10,000。
思路
参考
public static void main(String[] args) {
int[] nums = {1,1,0,1,1,1};
int len = 0;
int maxLen = 0;
for (int num : nums) {
if (num == 1) len++; else len=0;
if(len > maxLen) maxLen = len;
}
System.out.println(maxLen);
}
数大雁
题目
一群大雁往南 飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。
具体的:
1.大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个"quack"。
2.大雁会依次完整发出"quack",即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。
3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。
输入:quackquack
输出:1
参考
public static void test1(String str,String calls){
/*
* str : 所有叫声 "ququackkack"
* calls : 一只大雁叫声的顺序 "quack"
* */
// 默认0只
int len = 0;
// 第一个q出现位置, 作为开始位置, 前面的都没有q,不完整,忽略
int startIndex = str.indexOf(calls.substring(0,1));
// 最后一个k出现位置,作为结束位置, 后面的都没k,不完整,忽略
int endIndex = str.lastIndexOf(calls.substring(calls.length()-1));
// 取出要计算的字符串
char[] chars = str.substring(startIndex, endIndex+1).toCharArray();
List<String> goose = new ArrayList<>();
for (char aChar : chars) {
// 取出当前叫声
String call = String.valueOf(aChar);
// 取出叫声所在位置
int i = calls.indexOf(call);
// 如果出现不应该出现的声音, 跳过
if( i == -1 ) continue;
// 如果是第一声, 添加
if( i == 0 ) {
goose.remove(calls.substring(calls.length()-1));
goose.add(call);
continue;
}
// 如果是其他叫声
int count = goose.size();
goose.remove(calls.substring(i-1,i));
if (count-1 == goose.size()) goose.add(call);
}
// 统计有几只
for (String s : goose) {
if(s.equals(calls.substring(calls.length()-1))) len++;
}
System.out.println( len == 0 ? -1 : len);
}
int sta[5] = {};
int max = -1;
int curmax = 0;
int cur = 0;
int curmin = 0;
//string str = "acaacckquacquacquacquacquackkkkkquacquacquack";
//string str = "ququackkack";
string str = "quacquacquacquacquackkkquacquacquacquacquacquacquackkkkquacquacquack";
string calls = "quack";
for (string::iterator it = str.begin();it!=str.end();++it) {
switch (*it) {
case 'q':
++cur;
if (curmax < cur) {
++curmin;
curmax = cur;
}
++sta[1];
break;
case 'u':
if (sta[1] > 0) {
--sta[1];
++sta[2];
}
break;
case 'a':
if (sta[2] > 0) {
--sta[2];
++sta[3];
}
break;
case 'c':
if (sta[3] > 0) {
--sta[3];
++sta[4];
}
break;
case 'k':
if (sta[4] > 0) {
--sta[4];
--cur;
}
if (curmin > cur) {
curmin = cur;
}
break;
default:
break;
}
}
if (curmax == 0) {
max = -1;
}else {
max = curmax - curmin;
}
cout << max << endl;