方法二:

public boolean isUniqueChars2(String str)

{

//ascii码表总共就256个字符,如果长度大于256就直接回false

if (str.length() > 256) return false;

//一个个字符取过去,每取一个就比较一次,若之前没有过,则将该位值置为true.

boolean[] char_Set = new boolean[256];

for (int i = 0; i < str.length; i++)

{

int val = str.chatAt(i);

if (char_Set[val])

{

return false;

}

char_Set[val] = true;

}

}

Q1.2 判定是否互为字符重排

题目:给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

示例 1:

输入: s1 = “abc”, s2 = “bca”

输出: true

示例 2:

输入: s1 = “abc”, s2 = “bad”

输出: false

说明:

0 <= len(s1) <= 100

0 <= len(s2) <= 100

/*

*此处定义数组长度为128,因为基础ASCII码是128位,如果算上拓展ASCII码才有256位。

*思路:其实就是计算 两个字符串 中是否包含一样多的相同字符

*/

class Solution {

public boolean CheckPermutation(String s1, String s2) {

if (s1.length() != s2.length()) {

return false;

}

int[] repeats1 = new int[128];

for (int i = 0; i < s1.length(); i++) {

repeats1[s1.charAt(i)]++;

repeats1[s2.charAt(i)]–;

}

for (int i = 0; i < repeats1.length; i++) {

if (repeats1[i] != 0) {

return false;

}

}

return true;

}

}

Q1.3 URL化

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

示例1:

输入:"Mr John Smith    ", 13

输出:“Mr%20John%20Smith”

思路

注意:这里只说知道字符串“真实”长度,但S.length()足够存放新增字符,可能后面还有好多空格。

计算符串“真实”长度空格数,然后从后往前reset字符串,最后去除后面的空格

class Solution {

public:

string replaceSpaces(string S, int length) {

int space=0;//count the space num

for(int i=0;i<length;i++){

if(S[i]==’ ') space++;

}

int j=length+2*space-1;

for(int i=length-1;i>=0;i–){

if(S[i]==’ '){

S[j–] = ‘0’;

S[j–] = ‘2’;

S[j–] = ‘%’;

}

else S[j–] = S[i];

}

return S.substr(0,length+2*space);//cut the string, don’t let space influence the result

}

};

Q1.4 回文排列

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

示例1:

输入:“tactcoa”

输出:true(排列有"tacocat"、“atcocta”,等等)

网上大佬的代码

var canPermutePalindrome = function (s) {

let mySet = new Set();

for (let i of s) {

mySet.has(i) ? mySet.delete(i) : mySet.add(i)

}

return mySet.size <= 1

};

优化后的(减少了时间)

var canPermutePalindrome = function (s) {

let hash = [];

for (let i of s) {

hash[i] = 0;

}

for (let i of s) {

hash[i]++

}

let count = 0;

for (let j of Object.values(hash)) {

if (j % 2 != 0) {

count++

}

}

return count < 2 ? true : false;

};

Q1.5 一次编辑

字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

示例 1:

输入:

first = “pale”

second = “ple”

输出: True

示例 2:

输入:

first = “pales”

second = “pal”

输出: False

思路:

1.如果两个字符串长度差大于1,则输出false

2.如果两个字符串长度相等,则两个字符串同一个下标的字符不同的个数应小于2个。

3.如果两个字符串长度差等于1,则长度长的字符串必须包含所有长度短的字符串的每个字符,如果有一个字符没有,则输出false

4,。如果长度长的字符串包含所有长度短的字符串的每个字符,则继续判断,将长度长的字符串多出的字母除去,再判断两个字符串的hashcode是否相等,不等则false

package s;

public class onceEdit {

public static void main(String[] args) {

long startTime = System.currentTimeMillis();

String str1=“palesdasdads”;

String str2=“plesdasdas”;

boolean res = ifOnceEdit(str1,str2);

long endTime = System.currentTimeMillis();//获取当前时间

System.out.println(res);

System.out.println(“程序运行时间:”+(endTime-startTime)+“ms”);

}

private static boolean ifOnceEdit(String str1, String str2) {

if (Math.abs(str1.length()-str2.length())>=2) {

return false;

}

else if (str1.length()==str2.length()){

int count=0;

for (int i=0;i<str1.length();i++) {

if(str1.charAt(i)!=str2.charAt(i)) {

count=count+1;

}

}

if(count>=2) {

return false;

}

}

else{

String str11=str1.length()>str2.length()?str1:str2;

String str22=str1.length()>str2.length()?str2:str1;

for(int i=0;i<str22.length();i++) {

if(str11.charAt(i)!=str22.charAt(i)) {

String str111 =str11.substring(i+1);

String str222=str22.substring(i);

if(str11.substring(i+1).equals(str222)) {

return true;

}

}

}

}

return false;

}}

Q1.6 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:“aabcccccaaa”

输出:“a2b1c5a3”

示例2:

输入:“abbccd”

输出:“abbccd”

解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。

class Solution {

public String compressString(String S) {

if (S == null || S.length() <= 2) {//首先判断字符串是否为空,是否长度小于2,是直接返回

return(S);

}

//注意StringBuilder不能写在if判断前面

StringBuilder a = new StringBuilder().append(S.charAt(0));

int num = 1;

for(int i=1;i < S.length();i++){

char c = S.charAt(i-1);

char b = S.charAt(i);

if( c == b){

num++;

}else{

a.append(num).append(S.charAt(i));

num = 1;

}

}

//最后判断输出结果与原字符串长度是否小于他

return(a.append(num).length() < S.length() ? a.toString():S);

}

}

Q1.7 旋转矩阵

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例 1:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

写在最后

对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。

![
[]


文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等,需要这些文档资料的,直接点击我的GitHub免费领取~

.(img-QVe69wEH-1711056870982)]

写在最后

对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。

[外链图片转存中…(img-wAQp741J-1711056870983)]

[外链图片转存中…(img-6zK9iaP4-1711056870984)]
[]

[外链图片转存中…(img-AE2383Ec-1711056870984)]
[外链图片转存中…(img-ukwBoa3U-1711056870985)]

文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等,需要这些文档资料的,直接点击我的GitHub免费领取~

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐