字符串题目
import java.util.Scanner;
public class solution{
public static void solution(int n)
{
int ans=0;
for(int i=1;i<=n;i++)
{
String s=makehuiwen(i);
ans=ans+Integer.parseInt(s);
}
System.out.print(ans);
}
public static String makehuiwen(int n)
{
StringBuffer s=new StringBuffer();
for(int i=1;i<=n;i++)
{
s.append(i+"");
}
for(int i=n-1;i>=1;i--)
{
s.append(i+"");
}
return s.toString();
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
System.out.print(n);
}
}
约瑟夫环问题
import java.util.Scanner;
public class solution{
public static void solution(int n)
{
int ans=0;
for(int i=2;i<=n;i++)
ans=(ans+3)%i;
System.out.print(ans+1);
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
solution(n);
}
}
字符串大小写转换(暴力求解)大写变小写要+32
import java.util.Scanner;
public class solution{
public static void solution(String s)
{char[] c=s.toCharArray(); for(int i=0;i<c.length;i++) if(c[i]<='Z'&&c[i]>='A') c[i]=(char)(c[i]+32); for(int i=0;i<c.length;i++) System.out.print(c[i]);
}
public static void main(String[] args)
{String s="adsaADsaA"; solution(s);
}
}输出字符串中仅出现一次的第一个字符(暴力求解)
import java.util.Scanner;
public class solution{
public static void solution(String s)
{char[] c=s.toCharArray();
int[] m=new int[700000];
for(int i=0;i<s.length();i++)m[c[i]-'0']++;
for(int i=0;i<s.length();i++)
if(m[c[i]-'0']==1) System.out.print(c[i]);
}
public static void main(String[] args)
{String s="adsaADsaA"; solution(s);
}
}给出 A,B 两个字符串,求在第一个字符串出现,但第二个字符串中未出现,
重复出现时只取第一次出现,输出字符串
import java.util.Scanner;
public class solution{
public static void solution(String s1,String s2)
{char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
int[] m=new int[700000];
int[] n=new int[700000];
for(int i=0;i<s1.length();i++)if(m[c1[i]-'0']==0)m[c1[i]-'0']++;
for(int i=0;i<s2.length();i++)
if(n[c2[i]-'0']==0) n[c2[i]-'0']++;
for(int i=0;i<s1.length();i++)
if(m[c1[i]-'0']==1&&n[c1[i]-'0']==0) System.out.print(c1[i]);
}
public static void main(String[] args)
{String s1="adsaADsaA"; String s2="zzsafasdsa"; solution(s1,s2);
}
}
import java.util.*;
public class solution{
public static void solution(String s1,String s2)
{Map map=new HashMap(); for(int i=0;i<s1.length();i++) if(!map.containsKey(s1.charAt(i)))map.put(s1.charAt(i),1); for(int i=0;i<s2.length();i++) if(map.containsKey(s2.charAt(i)))map.remove(s2.charAt(i)); for(int i=0;i<s1.length();i++) if(map.containsKey(s1.charAt(i))) System.out.print(s1.charAt(i));
}
public static void main(String[] args)
{String s1="adsaADsaA"; String s2="zzsafasdsa"; solution(s1,s2);
}
}
(暴力求解,hash对应+滑动窗口思想)给定一个字符串,一个子串,判断子串在该字符串中出现的次数(暴力+滑动窗口)
public class solution{
public static void solution(String s,String t)
{char[] s1=s.toCharArray(); char[] t1=t.toCharArray(); int time=0; int j=0; int i=0; while(i<s1.length&&j<t1.length) { if(s1[i]==t1[j]) { i++;j++; if(j==t1.length){j=0;time++;} } else { i=i-j+1; j=0; } } System.out.print(time);
}
public static void main(String[] args)
{solution("abababababab","ab");
}
}字符串移除奇数位置字符问题(暴力求解)
public class solution{
public static void solution(String s)
{int n=s.length(); char[] s1=s.toCharArray(); char[] ans=new char[n]; int j=0; for(int i=0;i<n;i++) { if(i%2==0) {ans[j]=s1[i];j++;} } for(int i=0;i<ans.length;i++) System.out.print(ans[i]);
}
public static void main(String[] args)
{solution("abababababab");
}
}
import java.util.*;
public class solution{
public static void solution(String s1,String s2)
{int i=0;int j=0;int time=0; char[] c1=s1.toCharArray(); char[] c2=s2.toCharArray(); while(i<c1.length&&j<c2.length) { if(c1[i]==c2[j]) { i++;j++; if(j==s2.length()) { j=0;time++; } } else { i=i-j+1; j=0; } } System.out.print(time);
}
public static void main(String[] args)
{String s1="adsaADsaafadadadaA"; String s2="ad"; solution(s1,s2);
}
}字符串括号匹配问题(考察循环和if语句并不涉及算法部分)
import java.util.*;
public class solution{
public static void solution(String s1)
{Stack<Character> stack=new Stack<Character>(); for(int i=0;i<s1.length();i++) { if(s1.charAt(i)=='('||s1.charAt(i)=='['||s1.charAt(i)=='{') stack.push(s1.charAt(i)); if(stack.peek()=='('&&s1.charAt(i)==')') stack.pop(); else if(stack.peek()=='['&&s1.charAt(i)==']') stack.pop(); else if(stack.peek()=='{'&&s1.charAt(i)=='}') stack.pop(); } if(stack.empty()) System.out.print("yes");
}
public static void main(String[] args)
{String s1="()"; solution(s1);
}
}字符串反转输出问题(暴力求解)reverse
public class solution{
public static void solution(String s)
{char[] c=s.toCharArray(); for(int i=s.length()-1;i>=0;i--) { System.out.print(c[i]); }
}
public static void main(String[] args)
{solution("abababababab");
}
}去掉字符串末尾的空格(暴力求解)
public class solution{
public static void solution(String s)
{StringBuilder s1=new StringBuilder(); for(int i=0;i<s.length();i++) { if(s.charAt(i)!=' ') s1.append(s.charAt(i)); } for(int i=0;i<s1.length();i++) System.out.print(s1.charAt(i));
}
public static void main(String[] args)
{solution("abababab aba b");
}
}判断一个字符串中数字,大小写字母、空格以及特殊字符的数量并输出(暴力求解)
不是其余的就是特殊字符了,汉字就判断在!(40《x《127)输出一组字符串,再输入一组字符串,判断是否有与之前字符串一致,有则
输出是第几个字符与之前字符串一致(用hash对照以下)
import java.util.HashMap;
import java.util.Map;
public class solution{
public static void solution(String[] s,String a)
{
Map map=new HashMap();
for(int i=0;i<s.length;i++)
{
map.put(s[i], i);
}
if(map.containsKey(a))
System.out.print(map.get(a));
}
public static void main(String[] args)
{
String[] s={"absdad","as","asd"};
String a="asd";
solution(s,a);
}
}
18.输出字符串的最大回文子字符串的长度(输入一串字符串,判断里面是否有
回文字串,如“12321”,有则输出其中最大的长度,如“211232109”输出 5)(dp动态规划)
import java.util.HashMap;
import java.util.Map;
public class solution{
public static void solution(String s)
{
boolean[][] map=new boolean[s.length()][s.length()];
char[] a=s.toCharArray();
String ans="";
for(int l=0;l<s.length();l++)
{
for(int i=0;i+l<s.length();i++)
{
int j=i+l;
if(l==0){map[i][j]=true;}
else if(l==1){map[i][j]=(a[i]==a[j]);}
else map[i][j]=((a[i]==a[j])&&(map[i+1][j-1]));
if(l+1>ans.length()&&map[i][j])ans=s.substring(i,j+1);
}
}
System.out.print(ans);
}
public static void main(String[] args)
{
String s="12321";
solution(s);
}
}
19.判断给定字符串是不是 ip 地址(判断 Ip 地址是否合法,如 128.211.11.2 将
字符串分为 128 211 11 2 四个整形变量,判断范围是否在 0~255 之间,若有
一个不在范围内,则为不合法)(暴力求解)
import java.util.HashMap;
import java.util.Map;
public class solution{
public static void solution(String s)
{
String[] a=s.split("\.");
for(int i=0;i<a.length;i++)
{
if(Integer.parseInt(a[i])>=255||Integer.parseInt(a[i])<=0)
{
System.out.print("no");return;
}
}
System.out.print("yes");
}
public static void main(String[] args)
{
String s="128.298.11.2";
solution(s);
}
}
20.按出现频率高低输出字母,给出字典序列为 aaabbbbassd(暴力求解+字符对应数组的hash)
21.编写一个函数来查找字符串数组中的最长公共前缀,若不存在公共前缀,返
回空字符串 (暴力搜索,分开写函数就比较清晰了)
public class midsreach {
public static String solution(String[] s)
{
String ans=s[0];
String temp="";
for(int i=0;i<s.length;i++)
{
temp=com(ans,s[i]);
if(temp.length()<ans.length())
{ans=temp;}
}
System.out.print(ans);
return ans;
}
public static String com(String a,String b)
{
String ans="";
int index=0;
int n=Math.min(a.length(), b.length());
for(int i=0;i<n;i++)
{
if(a.charAt(i)==b.charAt(i))index++;
else break;
}
ans=a.substring(0, index);
return ans;
}
public static void main(String arg[])
{
String[] s={"flower","flow","flight"};
solution(s);
}
}
private static String longestSameStr(String[] strs){
if(strs.length==0)
return "";
String s=strs[0];
for(int i=1;i<strs.length;i++){
while (strs[i].indexOf(s)!=0){
s=s.substring(0,s.length()-1);
}
}
return s;
}
22.输入一个数字组成的字符串,再输入一个数字,数字代表在输入的字符串前面加 0 要达到的长度,例如输入字符串 23,输入数字 8,则输出就是 00000023(暴力求解)
23.输入一个字符串,不同的单词间用空格隔开,把这些单词的首字母取出并大
写输出,如输入:hello world,输出:HW,请实现多行输入的输出,输入 0
则停止继续输入(暴力求解)
11.输出字符串简称,例如字符串是"end of file",输出"EOF"(暴力求解)split“ ”或者if判断
8. 输出字符串中仅出现一次的第一个字符(暴力求解)数组哈希
7. 字符串大小写转换(暴力求解)+-32
6. 求字符串的所有子串(暴力求解)可以自己写一个substring就可以了
4. 判断两个字符串是否是异位:比如 abcn 和 banc 是一对,anc 和 nac 是一对,
两个字符串完全奇偶互换,则称为异位,判断两个字符串是否为异位词,意
思是判断两个字符串有相同数量的字母(就是去简单的判断一下是不是有相同的字母,sort飘过或者用hash)数组哈希看看是不是相等的
5. 字符串中字符替换:把字符串中的字符 a 和 A 换成 c 输出(暴力求解)for+if
61.买 n 次水果,每次买的个数和种类都不同,问买苹果的个数。例如:第一次
"apple orange banana",第二次"apple orange",第三次"orange"买两次,则 apple=2(split)
哈希统计下
67给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。(也适用于大数之和问题!!!!)
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder s=new StringBuilder();
int i=num1.length()-1,j=num2.length()-1;int add=0;
for(;i>=0||j>=0||add!=0;i--,j--)
{
int n1=i>=0?num1.charAt(i)-'0':0;
int n2=j>=0?num2.charAt(j)-'0':0;
s.append((n1+n2+add)%10);
add=(n1+n2+add)/10;
}
s.reverse();
return s.toString();
}
}
37.要求实现大数的乘法,两个 1000000000 以内的数相乘。
利用字符传运算
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder s=new StringBuilder();
int i=num1.length()-1,j=num2.length()-1;int add=0;
for(;i>=0||j>=0||add!=0;i--,j--)
{
int n1=i>=0?num1.charAt(i)-'0':0;
int n2=j>=0?num2.charAt(j)-'0':0;
s.append((n1n2+add)%10);
add=(n1n2+add)/10;
}
s.reverse();
return s.toString();
}
}
38输入两个整数 M 和 N,输出两个数转化为二进制)
public void binaryToDecimal(int n){
int t = 0; //用来记录位数
int bin = 0; //用来记录最后的二进制数
int r = 0; //用来存储余数
while(n != 0){
r = n % 2;
n = n / 2;
bin += r * Math().pow(10,t);
t++;
}
System.out.println(bin);
}